上一篇文章我们理解了平均负载、上下文切换和中断这三个 CPU 核心指标,现在需要用工具把它们“可视化”出来。CPU 性能分析工具非常多,但真正高频使用的也就那么几个。本文聚焦于四个最核心的工具:top/htop(全局进程视图)、mpstat(多核分布视图)和 pidstat(进程级精细视图)。掌握这四把“手术刀”,你就能从“系统整体负载高”快速定位到“具体是哪个进程的哪个线程在消耗 CPU”。
一、top:系统自带的全能选手
top 是 Linux 系统预装的进程监控工具,几乎是所有性能排查的第一步。
1.1 启动与基本操作
top进入交互界面后,常用快捷键:
1.2 关键指标解读
top 输出的上半部分是系统统计信息:
top-14:23:01 up10days,3:15,2users, load average:2.50,1.80,1.20Tasks:123total,2running,121sleeping,0stopped,0zombie %Cpu(s):25.0us,5.0sy,0.0ni,68.0id,1.0wa,0.0hi,1.0si,0.0stus(user):用户态 CPU 占用。应用程序代码运行的时间占比。
sy(system):内核态 CPU 占用。系统调用、内核操作的时间占比。如果 sy 持续 > 30%,可能存在系统调用过于频繁的问题。
ni(nice):低优先级(nice 值为正)进程的 CPU 占用。
id(idle):空闲 CPU。
wa(iowait):等待 I/O 完成的时间。wa > 20% 通常意味着磁盘或网络 I/O 成为瓶颈。
hi(hardware interrupt):硬中断处理时间。
si(software interrupt):软中断处理时间。网络密集型服务器上 si 通常较高。
st(steal time):虚拟化环境中,宿主机 CPU 被其他虚拟机占用的时间。st > 10% 说明宿主机 CPU 超售严重。
1.3 进程列表关键列
1.4 实战技巧
技巧一:将 top 输出保存到文件
top-d1-b-n3>top.log# 间隔1秒采集3次数据[reference:6]技巧二:只监控特定进程
top-p1234# 只监控 PID 为 1234 的进程技巧三:显示完整的命令行
按 c 键可切换显示完整命令行,方便区分同名进程。
二、htop:top 的现代化增强版
htop 是 top 的改进版本,界面更友好、操作更直观,但需要单独安装:
# Ubuntu/Debiansudoaptinstallhtop# CentOS/RHELsudoyuminstallhtop2.1 htop 的主要优势
2.2 htop 常用操作
F2:进入设置菜单,可自定义显示的列和排序方式
F3:搜索进程
F4:过滤器(只显示匹配的进程)
F5:树形视图(查看进程父子关系)
F6:选择排序字段
F9:kill 进程
F10:退出
2.3 何时用 htop 替代 top?
需要快速理解进程间关系:树形视图比 top 的平面列表直观得多。
需要频繁操作进程:htop 的鼠标支持和快捷键让操作更高效。
视觉偏好:彩色界面让数据一目了然。
三、mpstat:多核 CPU 的“X 光机”
mpstat(Multiprocessor Statistics)是 sysstat 工具包的一部分,核心价值是查看每个 CPU 核心的详细使用率。
安装方法:
sudoaptinstallsysstat# Ubuntu/Debiansudoyuminstallsysstat# CentOS/RHEL3.1 基本用法
# 查看所有 CPU 核心的统计信息,每秒刷新一次mpstat-PALL1[reference:10]输出示例:
19:43:58 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle19:43:59 all0.000.000.040.000.000.000.000.0099.9619:43:5900.000.000.000.000.000.000.000.00100.0019:43:5910.000.000.000.000.000.000.000.00100.0019:43:59299.010.000.000.000.000.000.000.000.99[reference:11]3.2 输出字段详解
3.3 mpstat 的典型应用场景
场景一:发现“单核打满”问题
整体 CPU 使用率看起来不高(如 25%),但应用性能却很差。用 mpstat -P ALL 1 检查每个核心:
CPU %usr %idle0100%0% ← 核心0已打满10%100%20%100%30%100%结论:应用是单线程计算密集型,需要优化代码支持多线程,或使用 taskset 绑定到特定核心。
场景二:判断中断分布是否均衡
查看 %irq 和 %soft 在各核心上的分布。如果某个核心的 %irq 特别高,说明中断没有均匀分布,需要调整中断亲和性。
场景三:确认 CPU 饱和
%idle 持续 < 10% 表明 CPU 已饱和。
四、pidstat:进程级的“显微镜”
pidstat 同样是 sysstat 工具包的一部分,它能按进程(或线程)精细统计 CPU、内存、I/O 和上下文切换。
4.1 CPU 使用率统计(-u)
pidstat-u51# 每5秒采样一次,输出1次[reference:16]输出:
13:37:07UIDPID %usr %system %guest %wait %CPU CPU Command13:37:1202962100.000.000.000.00100.001stress[reference:17]%wait:等待 CPU 的时间占比(即进程就绪但未获得 CPU 的时间)。
%CPU:总 CPU 使用率(%usr + %system)。
💡 实战价值:%wait 列能直接告诉你进程是否在排队等 CPU。如果 %wait 很高但 %CPU 不高,说明系统 CPU 饱和,进程在排队。
4.2 上下文切换统计(-w)
这是 pidstat 最独特的功能——它能告诉你每个进程的上下文切换情况,而 vmstat 只能看系统总数。
pidstat-w5[reference:21]输出:
08:18:26UIDPID cswch/s nvcswch/s Command 08:18:31010.200.00systemd 08:18:31085.400.00rcu_sched[reference:22]cswch/s:自愿上下文切换——进程主动让出 CPU(如等待 I/O、锁、sleep)。高值通常意味着 I/O 密集型应用。
nvcswch/s:非自愿上下文切换——进程被系统强制抢占(时间片耗尽)。高值意味着 CPU 竞争激烈。
💡 实战价值:高 nvcswch/s + 高 %wait → CPU 饱和,需要增加 CPU 或优化代码。高 cswch/s → I/O 瓶颈或锁竞争。
4.3 查看线程级别的上下文切换(-wt)
pidstat-wt1[reference:27]输出示例:
08:14:05UIDTGID TID cswch/s nvcswch/s Command 08:14:05010551-6.000.00sysbench 08:14:050-105516.000.00|__sysbench 08:14:050-1055218911.00103740.00|__sysbench ← 子线程上下文切换极高即使主线程的上下文切换看起来正常,子线程可能才是真正的“罪魁祸首”。
4.4 其他常用选项
五、四款工具的协作流程
当遇到 CPU 性能问题时,按以下顺序使用这四款工具:
text
第1步:top / htop
↓ 发现 CPU 使用率高的进程 PID
第2步:mpstat -P ALL 1
↓ 确认是单核打满还是多核均衡
第3步:pidstat -u -p PID 1
↓ 确认该进程的 CPU 使用率和 %wait
第4步:pidstat -w -p PID 1
↓ 查看上下文切换类型(自愿/非自愿)
第5步:根据结果深入排查
├── 非自愿切换高 → CPU 竞争激烈 → 考虑扩容或优化代码
├── 自愿切换高 → I/O 等待或锁竞争 → 用 iostat 检查磁盘
└── 单核打满 → 代码单线程瓶颈 → 考虑多线程改造或 taskset
六、小结
top:第一现场工具,快速定位 CPU/内存占用最高的进程。
htop:top 的增强版,界面友好、操作高效。
mpstat:查看每个 CPU 核心的使用率分布,发现“单核打满”问题。
pidstat:进程级精细分析,查看 CPU、上下文切换、内存、I/O 等指标。
这四个工具构成了 CPU 性能分析的“标准四件套”,熟练掌握它们,你就能从“系统负载高”快速定位到具体是哪个进程的哪个线程在消耗 CPU,以及为什么消耗。