必须用 mpstat -P ALL 才能看清每个核的空闲率,因为默认 mpstat 只输出 all 行(所有核平均值),在 4 核机器上 %idle 显示 75% 可能实为一核 0% idle(100% 满载)、其余三核全空闲,掩盖单核瓶颈。

直接看 mpstat -P ALL,别信 top 里那个“总使用率”——它会掩盖单核满载问题。
为什么必须用 -P ALL 才能看清每个核的空闲率
默认不加参数的 mpstat 只输出 all 行,也就是所有核的平均值。在 4 核机器上,%idle 显示 75%,可能实际是:0 号核 0% idle(100% 满)、其余三核各 100% idle。这种失真会让音频、实时音视频、单线程服务类应用的瓶颈完全被忽略。
使用 -P ALL 后,输出中每行对应一个 CPU(包括 all 和具体编号如 0、1),%idle 列就是该核当前空闲时间占比。
-
mpstat -P ALL:一次性输出当前快照,含所有核和all行 -
mpstat -P ALL 1:每秒刷新一次,持续输出(适合盯屏观察) -
mpstat -P ALL 2 5:每 2 秒采样一次,共 5 次后退出
%idle 字段的真实含义和常见误读
%idle 是内核在每个 tick 周期里记录的“该核未运行任何任务且未等待 I/O”的时间比例。注意它不包含 %iowait —— 后者是 CPU 空闲但正在等磁盘/NFS/USB 等设备响应的时间,也属于“非计算态”,但 %idle 不算它。
- 若某核
%idle = 0.00且%iowait = 0.00,说明它真正在满负荷跑用户或内核代码 - 若
%idle = 0.00但%iowait > 0,说明该核卡在不可中断 IO 上(比如 NFS 挂载点失联),此时进程状态为D,kill -9无效 -
%idle长期低于 10% 不一定异常;但若仅一核长期 < 5%,其他核 > 90%,大概率是线程亲和性没设或程序未并行化
安装和启用前提:sysstat 必须运行,否则数据不准
mpstat 读取的是 /proc/stat,而该文件内容由内核每 tick 更新,所以理论上无需后台服务。但部分发行版(如 Ubuntu 22.04+)默认禁用 sysstat 的数据收集定时器,导致 mpstat 在某些场景下首行(系统启动以来平均值)不准,或低频采样时数值跳变大。
- 确认已安装:
sudo apt install sysstat(Debian/Ubuntu)或sudo dnf install sysstat(Fedora/RHEL8+) - 启用数据收集(关键):
sudo systemctl enable --now sysstat - 验证:
systemctl is-active sysstat应返回active;cat /var/log/sysstat/sa$(date +%d)能看到二进制日志
快速定位高负载核心的实操命令组合
光看 %idle 只知道“哪核忙”,不知道“谁在忙”。要闭环排查,得配合 ps 或 pidstat:
- 先锁定最忙的核:
mpstat -P ALL 1 3 | grep -E "^( [0-9]+|all)" | sort -k 10,10nr | head -n 2(按%idle倒序,找最低的那个编号) - 再查该核上跑的线程:
ps -eo pid,psr,comm,%cpu --sort=-%cpu | head -n 20,其中psr列即所属 CPU 编号 - 更精准的线程级绑定:
pidstat -t -p $(pgrep -f "your_app") 1,观察%CPU和PSR列是否集中于某核
真正容易被忽略的不是命令怎么写,而是把 %idle 当成“健康指标”——它只是表象。单核 %idle 持续过低,背后可能是线程绑核错误、锁竞争、或驱动层中断风暴,得往 /proc/interrupts 和 perf record -e irq:irq_handler_entry 深挖。


















