mpstat是Linux中用于监控多核CPU各核心利用率的实时工具,能显示每个逻辑CPU的%usr、%sys、%iowait、%idle等指标,支持-P ALL查看所有核心负载均衡情况,适用于性能调优与瓶颈分析。

单看 %CPU 数值无法判断多线程并行效率——它只告诉你“用了多少”,不告诉你“是不是真并行起来了”。真正要看的是各核心负载是否均衡、是否存在单核打满而其他核空闲、上下文切换是否异常高。
用 mpstat -P ALL 看每个核心的真实利用率
这是最直接的方式。mpstat 能拆出每个逻辑 CPU 的 %usr、%sys、%iowait、%idle,比 top 按 1 展开更稳定、更适合脚本解析。
- 执行
mpstat -P ALL 1:每秒刷新一次,所有核心 + 汇总行都可见 - 重点关注
%idle列:如果某个核心长期%idle接近 100%,而另一核心持续 >90% —— 说明程序没跑出并行性,可能是锁竞争、串行逻辑或 affinity 绑定错误 - 对比
all行的%usr和单核最高%usr:若前者只有 30%,但某核心已到 95%,说明负载严重不均 - 注意:
-P ALL是必须的;-p all(小写 p)是旧版本兼容写法,新 sysstat(12.0+)已弃用,会报错
用 pidstat -t 看线程级 CPU 分布
进程显示高 CPU,但不知道是主线程还是 worker thread 在扛——这时要下钻到线程粒度。
- 运行
pidstat -t -p <pid> 1</pid>:每秒输出该进程下所有线程的%CPU,TID列即线程 ID - 观察
%CPU是否分散在多个TID上:如果只有 1~2 个线程长期占满,其余接近 0,说明并行度低或 GIL(如 Python)、锁争用、任务分发不均 - 配合
ps -T -p <pid></pid>查看线程名,确认哪些是业务线程、哪些是 GC 或日志线程 - 注意:
pidstat -t默认不显示线程名,需确保内核支持/proc/[pid]/task/[tid]/comm(Linux 2.6.32+ 基本都有)
用 vmstat 看上下文切换和就绪队列压力
高并行不等于高效并行。如果线程数远超核心数,频繁调度反而拖慢整体吞吐。
- 运行
vmstat 1,重点盯住两列:cs(context switch / sec)和r(runnable processes) -
r > CPU核心数:就绪队列积压,CPU 已成瓶颈,再多线程也白搭 -
cs持续 > 50000/sec:说明调度开销过大,可能因线程数过多、锁粒度过细或频繁唤醒 - 对比
mpstat的%idle:若%idle很高但r也大,说明进程在 sleep/wake 频繁切换(比如轮询),不是计算瓶颈而是设计问题
并行效率不是“开了多线程就一定快”,关键看硬件资源是否被均匀、持续地驱动。最容易被忽略的是:即使 mpstat 显示各核利用率差不多,如果 pidstat -t 揭示线程间存在长尾延迟(比如一个线程卡在锁上 800ms,其余早完成了),整体耗时仍由最慢那个决定——这时看平均值毫无意义,得结合 perf sched 或应用层 trace 才能定位。


















