运行mpstat无参数时显示系统启动以来CPU全局平均使用率,基于/proc/stat累计tick计算,不反映实时负载或单核差异;需用mpstat -P ALL 1监控各核实时状态,结合ps、pidstat等工具定位具体进程。

直接运行 mpstat 就能拿到系统启动以来的 CPU 平均使用率,但多数时候你真正需要的是「每个核的实时负载」或「某段时间内的峰值分布」——这得靠参数组合,不是敲完就完事。
不加参数时 mpstat 在看什么
执行 mpstat(无任何选项)会读取 /proc/stat 中自系统启动累计的 tick 数,计算出全局平均值。它不反映当前负载,也不区分核心,只适合粗略判断历史倾向。
- 输出里
%idle低于 70% 未必代表现在卡顿,可能只是某次编译拖长了均值 - 没有
-P ALL就看不到单核差异,比如cpu0跑满而cpu3空闲这种典型负载不均问题 - 若系统刚重启不久,数据量少,平均值波动大,参考价值低
监控所有 CPU 核心的实时状态
用 mpstat -P ALL 1 才是日常排查的标准姿势:每秒刷新一次,显示每个核心 + all 行汇总。
-
-P ALL是必须项,漏掉就只显示整体均值,失去多核诊断意义 - 间隔设为
1秒较合理;小于 0.5 秒容易刷屏且内核采样精度没提升,大于 2 秒可能错过短时毛刺 - 注意第一行时间戳是采样起点,后续每行是该秒内统计,不是“上一秒”的快照
- 如果看到某核
%iowait持续 >20%,优先查磁盘 I/O(如iostat -x 1),不是 CPU 不够
定位单个高负载 CPU 的具体编号
当 mpstat -P ALL 1 显示某个核心(比如 cpu2)长期 %usr >80%,下一步要确认是谁在用它:
- 先用
ps -eo pid,psr,comm --sort=-pcpu | head -10查进程绑定的核心(psr列即 CPU 编号) -
psr值为 2 表示该进程当前在cpu2运行,但可能被调度器迁移——需配合taskset -p <pid></pid>看是否绑核 - 别直接信
top默认视图:按1键才展开各核,且它是采样间隔而非精确追踪 - 虚拟机环境要注意
%steal,若 >5%,说明宿主机 CPU 资源争抢严重,此时看宿主机mpstat更有效
避免常见误操作和陷阱
mpstat 不是万能表,几个关键限制得心里有数:
- 它不显示进程名、PID 或线程级数据,想定位具体程序得搭配
pidstat -u 1或htop -
mpstat 2 5和mpstat -P ALL 2 5效果不同:前者只输出整体均值,后者才分核;少写-P ALL就白跑了 - 容器环境里,
mpstat显示的是宿主机视角的 CPU 使用,不是容器 cgroup 限额内的实际消耗 - 某些云平台(如 AWS t3 实例)的
%steal可能虚高,需结合实例监控图表交叉验证
最常被忽略的一点:mpstat 的采样基于内核定时器,若系统处于深度空闲(如 cpuidle 高频触发),部分 tick 可能未被计入,导致 %idle 略低于真实值——这不是 bug,是设计使然。

















