CPU 占用过高

适用环境

  • 多核 CPU
  • 物理机安装虚拟化环境开虚拟机 (宿主机) / 虚拟机

表现形式

程序占用 CPU 并不高, 但是总体 CPU 占用很高

如图, 这台主机有 8 核 CPU, 按照 Linux 显示 87.8% 就是 1 个核心的 87.8% (如果这个程序占用了 2 个核心 CPU 的 100% 时间应该显示为 200%, Linux 进程 CPU 占用不是平均每个核心占用多少, 是全部核心的总和) 所以这个进程应该只用到了每个 CPU 核心的 12.5% 不到, 但是总体占用已经达到 30% 以上

接下来使用 Linux 进程管理器 top 查看

top

结果如图所示, CPU 大部分占用来自 st

st 的占用高达 27.5%

科普: 什么是 st 占用

详细介绍可以看 知乎专栏 (opens in a new tab)

st 的全称是 Steal Time

FinalShell 显示为 实时, 直接翻译过来是 被偷的时间

Steal Time (st) 指标, 用来衡量被 Hypervisor (宿主机) 偷去给其它虚拟机使用的 CPU 时间所占的比例, 这个值越高, 说明这台物理服务器的资源竞争越激烈

简单来说, 这个值越高, 只能说明两种情况

虚拟机

  • 宿主机限制你的 CPU 时间 (CPU 性能) 也就是性能/配置不够 一般建议升级配置

  • 宿主机超开, 1 个核心分给几个甚至十几个虚拟机使用

物理机 (宿主机)

  • CPU 可能设置了省电模式 (没有开启性能模式, 需要进入BIOS调整)

  • CPU 过热降频

解决方法

安装 irqbalancehaveged 两个软件包

  • irqbalance 均衡多个 CPU IRQ (软中断) 调整 CPU 亲和性 (进程在哪个核心多占一点, 哪个核心少占一点, 达到均衡效果)
  • haveged 补充随机数生成器 (RNG /dev/random) 的熵值, 加密数据需要用到, 如果不足可能会导致断流或者 CPU 占用率高

    科普: Linux 的随机数生成器与熵 (opens in a new tab)

安装软件包

  • CentOS / Alma Linux / Rocky Linux / Oracle Linux / Fedora / 其他 RHEL 系
yum update -y
yum install irqbalance haveged -y
  • Ubuntu / Debian / Armbian
apt-get update -y
apt-get install irqbalance haveged -y

启动服务并设置为开机自启

systemctl enable --now irqbalance
systemctl enable --now haveged

后记

如果安装了软件包 CPU 还是高说明宿主机超开真的太严重了, 换机器吧