mpstat -P ALL 是定位单核 CPU 瓶颈最直接有效的方式,可逐核查看 %usr 和 %idle 识别过载核心,结合 %steal 排除虚拟机干扰,并通过 top -1 + P、taskset 和 /proc/pid/status 验证进程是否被绑核或受 cgroup 限制。

用 mpstat -P ALL 是定位单核 CPU 瓶颈最直接有效的方式。它把整体 CPU 使用率拆解到每个逻辑核心(包括超线程),让你一眼看出是不是某颗核心被“打满”,而其他核心却闲着——这种不均衡往往就是性能卡点所在。
看每核 %usr 和 %idle,识别过载核心
执行 mpstat -P ALL 1(每秒刷新一次),输出中每一行对应一个 CPU ID(如 CPU 0、CPU 1…):
- %usr 持续接近 100%:说明该核上用户态程序(比如你的业务进程)在密集计算,没做并发优化或存在热点线程
- %idle 长期低于 5%:该核已基本无空闲时间,处于高负载状态
- 对比其他核心的 %idle:如果多数核心 idle 在 70% 以上,仅一两颗核心 busy,就确认是“单核瓶颈”而非整体资源不足
留意 %steal 值,排除虚拟机干扰
在云环境或虚拟机中,%steal 反映的是宿主机抢占本虚拟 CPU 时间的比例:
- %steal > 1%:说明不是你进程的问题,而是宿主机调度紧张,CPU 资源被其他虚拟机抢走
- 此时 mpstat 显示的 %usr/%sys 高,实际不可控,需联系云平台或调整虚拟机配额
结合 top -1 + P,确认高耗进程是否集中调度
mpstat 告诉你“哪颗核忙”,top 帮你查“什么进程在那颗核上跑”:
- 运行
top -1(必须带 -1,否则不显示各核曲线) - 按 P 键按 CPU 占用排序,再按 f 键添加 CPU 字段(显示该进程最近一次运行的核心编号)
- 观察高 %CPU 进程的 CPU 列是否都集中在同一个编号上,比如全是 0 或全是 3
验证是否人为绑核或受 cgroup 限制
即使调度器想均衡,也可能被显式限制:
- 查绑核:运行
taskset -cp <pid>,看输出是否只包含单个 CPU 编号(如 “current affinity list: 2”) - 查系统级限制:读
/proc/<pid>/status中的 Cpus_allowed_list 行,若只写 “0” 或 “3”,说明该进程只能跑在那一颗核上 - 这类配置常见于误操作、容器默认限制或旧版部署脚本,是隐藏最深的单核瓶颈原因



















