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 过热降频
解决方法
安装 irqbalance
和 haveged
两个软件包
irqbalance
均衡多个 CPU IRQ (软中断) 调整 CPU 亲和性 (进程在哪个核心多占一点, 哪个核心少占一点, 达到均衡效果)haveged
补充随机数生成器 (RNG/dev/random
) 的熵值, 加密数据需要用到, 如果不足可能会导致断流或者 CPU 占用率高
安装软件包
- 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 还是高说明宿主机超开真的太严重了, 换机器吧