htop默认只显示整体CPU平均负载条,无法反映各核负载是否倾斜;需通过F2设置将CPU average替换为CPU,或直接写配置文件启用每核独立条形图,配合mpstat -P ALL 1分析不均衡性,并结合/proc/stat差值计算及lscpu、numactl等工具排查超线程、NUMA和中断分布等伪不均因素。

htop 默认不显示每核负载条,得手动改配置
直接运行 htop 看到的顶部 CPU 条是“整体平均”,不是每核独立条——这根本没法看出负载是否倾斜。你看到一条 30% 的横条,可能是 cpu0 跑满、cpu7 空闲,但完全被平均掩盖了。
必须进设置把 CPU average 换成 CPU:
- 运行
htop→ 按F2进 Setup → 找到 “Available meters” 区域 - 把左栏的
CPU average移走,把右栏的CPU(注意:没后缀,不能写CPU0或CPU_all)拖进Meters列表 - 按
F10保存,退出重进就生效
更省事的是直接写配置文件:echo "left_meters=CPU" > ~/.config/htop/htoprc && echo "right_meters=CPU" >> ~/.config/htop/htoprc。下次启动自动渲染所有逻辑核的实时条形图,颜色随负载变化(满载变红),刷新快、无延迟。
mpstat -P ALL 1 是唯一能看懂“不均衡”的命令
top 按 1 只显示总占用率(%Cpu0 那行),不拆解 %usr/%sys/%iowait,看不出是真干活还是卡在 I/O;htop 有图但没数字,没法定量比对。真正要判断“平衡度”,必须用 mpstat -P ALL 1。
关键点:
- 漏掉
-P ALL就只输出CPU all行,等于白跑 -
mpstat -P ALL 1 1输出单次快照,适合脚本取值;mpstat -P ALL 2每 2 秒刷新,适合肉眼盯屏 - 重点看组合:
%usr + %sys高 +%idle低 = 真忙;%iowait高 = 等磁盘,和 CPU 强弱无关
如果发现 cpu0 的 %usr 是 92%,其他核都 %idle > 95%,这就是典型单线程瓶颈,不是调度问题,是应用没并发。
/proc/stat 是唯一能做差值计算的底层来源
想画“动态走势图”,靠人眼盯 htop 或 mpstat 刷新太糙。真要导出数据喂给 gnuplot 或 Grafana,得自己读 /proc/stat。
每一行 cpuN 后面 10 个数字是累计 jiffies(通常 1 jiffy = 0.01 秒)。两次读取后,用第 5 字段(idle)差值算实际空闲时间,再推使用率:
grep '^cpu[0-9]' /proc/stat | head -4
输出类似:
cpu0 123456 123 45678 987654 0 123 456 0 0 0 cpu1 123400 110 45600 987700 0 110 440 0 0 0
这里 987654 和 987700 是 idle 时间,差值越大说明该核越空闲。两次采样间隔内,各核 idle 差值除以总 idle 差值,才是真实使用率——这个算法没任何采样窗口干扰,精度最高。
别忽略超线程和 NUMA 带来的“假不均”
看到 mpstat 显示 cpu0 和 cpu1 负载远高于其他核,第一反应不是绑核或调调度器,而是查物理拓扑:
-
lscpu | grep "Thread\|Core\|Socket"看超线程是否开启,cpu0/cpu1 很可能属于同一物理核 -
numactl --hardware查 NUMA 节点分布,双路服务器上跨节点访问内存慢,进程被调度到远端 CPU 上会显得“忙”,其实是内存延迟高导致的伪高负载 -
cat /proc/interrupts | grep -E "(eth|nvme)"看中断是否扎堆在某几个核,这是网卡/RPS 或 NVMe 驱动没配好,不是 CPU 不够
这些细节不查清楚,光盯着“哪个核高”去优化,大概率白忙。


















