mpstat 是 sysstat 工具包中的一个轻量级命令行工具,用来报告 CPU 的使用情况。与 top 或 htop 不同,mpstat 能把 CPU 时间细分为用户态、系统态、IO 等待、硬中断、软中断、虚拟化偷取等类别,并且可以按每个核心分别输出。Debian 的官方仓库默认包含 sysstat 包,但最小化安装通常不会自动带上,需要手动安装。

这篇内容会从安装步骤开始,逐步拆解 mpstat 的输出字段,再结合多核场景给出实际排查思路,最后补充定时采样和 sar 历史数据的方法。
一、安装 sysstat 与基础用法
在 Debian 上安装 sysstat 比较简单,执行 sudo apt update 和 sudo apt install sysstat 即可。安装完成后,mpstat 命令会直接出现在系统中。需要注意的是,sysstat 服务默认不会自动开启,但这并不影响 mpstat 的实时查看功能;服务只负责定时采集并写入 /var/log/sysstat/ 目录,供 sar 回溯历史数据。
最简单的用法是不加任何参数直接运行 mpstat,此时输出的是系统自启动以来的平均 CPU 统计,只有一行 all 数据。更有实际意义的是指定采样间隔和次数,例如 mpstat 1 5 表示每秒采样一次,共采样 5 次。命令输出类似下面:
Linux 6.1.0-18-amd64 (debian) 10/20/2024 _x86_64_ (4 CPU) 04:15:22 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 04:15:23 PM all 2.00 0.00 1.25 0.00 0.00 0.25 0.00 0.00 0.00 96.50 04:15:24 PM all 1.50 0.00 1.00 0.00 0.00 0.25 0.00 0.00 0.00 97.25 04:15:25 PM all 3.25 0.00 1.75 0.00 0.00 0.50 0.00 0.00 0.00 94.50 04:15:26 PM all 2.00 0.00 1.25 0.00 0.00 0.25 0.00 0.00 0.00 96.50 04:15:27 PM all 1.75 0.00 1.00 0.00 0.00 0.25 0.00 0.00 0.00 97.00 Average: all 2.10 0.00 1.25 0.00 0.00 0.30 0.00 0.00 0.00 96.35
这个输出只显示了所有核心的平均值。如果服务器有 4 个核心,但其中一个核心已经被单线程任务占满,平均后的 %usr 可能仍然不高。要看到每个核心的独立统计,需要使用 -P ALL 参数,例如 mpstat -P ALL 1 3。此时 CPU 列会出现 0、1、2、3 以及 all,分别对应每个逻辑核心和整体平均。
二、mpstat 输出字段逐一拆解
mpstat 的百分比字段直接来自 Linux 内核 /proc/stat 中的 CPU 时间统计。每一列表示 CPU 在该状态下消耗时间占总时间的比例,所有非空闲字段相加之后,剩下的就是 %idle。理解这些字段的准确含义,是定位性能问题的前提。
%usr 表示运行用户态进程的时间,不包括 nice 调整过的进程;%nice 表示运行 nice 值为正的用户态进程时间,也就是低优先级任务;%sys 表示内核态运行时间,比如系统调用、内存管理、进程调度等,但不包括中断处理。%iowait 是比较容易误解的一列,它表示 CPU 处于空闲状态且系统中有未完成的磁盘 IO 请求。换句话说,%iowait 高并不等于 CPU 正在忙,而是说明磁盘子系统响应慢,连累了整体处理速度。%irq 是硬件中断处理时间,%soft 是软件中断处理时间,网络数据包收发通常会在软中断中处理大量工作。%steal 常见于云主机或虚拟化环境,表示虚拟机等待物理 CPU 的时间,也就是被宿主机或其他虚拟机偷走的时间。%guest 是运行虚拟 CPU 的时间,%gnice 是运行低优先级虚拟 CPU 的时间。%idle 则是完全空闲的时间,没有任何任务需要 CPU 处理。
可以借助下表快速对比这些指标的含义:
| 字段 | 含义 | 常见高值场景 |
|---|---|---|
| %usr | 普通用户态程序 | 计算密集型应用、死循环 |
| %sys | 内核态系统调用 | 频繁系统调用、文件系统压力 |
| %iowait | 空闲且有未完成IO | 磁盘慢、存储瓶颈 |
| %irq | 硬件中断 | 网卡、磁盘控制器中断 |
| %soft | 软件中断 | 网络收发包、定时器 |
| %steal | 虚拟化偷取 | 宿主机超卖、云主机争抢 |
| %idle | 完全空闲 | 正常空闲或低负载 |
实际排查时,不要看到 %iowait 高就以为 CPU 负载大。比如一台服务器磁盘响应时间达到 200 毫秒,%iowait 可能显示 60%,但 %usr 和 %sys 都很低,此时 CPU 大部分时间在等待 IO,并没有真正执行计算,重点应该转移到磁盘或存储链路。
三、多核环境下的单核瓶颈定位
多核服务器上的性能问题往往具有局部性。单个进程如果只用满一个核心,整体平均 CPU 使用率可能只有 12.5%(8 核服务器),但如果该进程是业务关键路径,响应延迟会明显上升。mpstat 的 -P ALL 正是为这种场景设计的。
例如在 4 核 Debian 主机上执行 mpstat -P ALL 1,可能看到如下结果:
04:20:01 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 04:20:02 PM all 26.00 0.00 3.50 0.00 0.00 0.25 0.00 0.00 0.00 70.25 04:20:02 PM 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 04:20:02 PM 1 2.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 97.00 04:20:02 PM 2 1.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00 04:20:02 PM 3 1.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00
从输出可以看出,0 号核心的 %usr 达到 100%,其他核心几乎空闲,整体平均只有 26% 左右。此时不应该急着扩容 CPU,而是先找到占用 0 号核心的进程。可以使用 top -H 或 pidstat -t 1 查看线程级 CPU 使用情况,再结合应用日志确认是否可以优化为多线程或调整 CPU 亲和性。
软中断分布不均是另一个常见问题。如果某块网卡的队列都绑定到同一个 CPU 核心,该核心的 %soft 会显著高于其他核心,而 %usr 可能并不高。这时候可以检查 cat /proc/interrupts 中的中断计数,或者使用 ethtool -l eth0 查看网卡队列数量。解决办法通常是开启 irqbalance 服务,或者手动将不同队列的中断请求绑定到不同核心。
四、定时采样、日志记录与 sar 历史数据
实时排查用 mpstat 1 5 已经足够,但有些性能问题只在特定时间段出现,比如凌晨备份任务或者促销高峰。此时需要把 mpstat 的输出持续写入文件。最简单的方式是执行 mpstat 5 > /tmp/mpstat_$(date +%F).log,让命令在后台运行。不过这种方式无法区分时间戳,后续分析时需要结合文件修改时间。
更推荐的方式是启用 sysstat 自己的数据收集服务。在 Debian 中,可以编辑 /etc/default/sysstat,将 ENABLED 的值设为 true,然后执行 systemctl restart sysstat。服务会按照 /etc/cron.d/sysstat 中的计划任务定时采集,默认每 10 分钟记录一次,数据保存在 /var/log/sysstat/ 目录下,文件名类似 sa20241020。之后就可以用 sar -u -P ALL -f /var/log/sysstat/sa20241020 查看历史数据,也可以直接 sar -u -P ALL 查看当天记录。
如果日志文件较大,可以使用 awk 提取特定指标超过阈值的行。例如下面的命令从 mpstat 输出中筛选出任意核心 %iowait 大于 10 的记录:
grep -E '^[0-9]|^Average' /tmp/mpstat.log | awk '$7+0 > 10 {print $0}'
注意 mpstat 输出中,%iowait 是第 7 列,字段顺序可能因版本略有差异,使用前建议先查看表头确认列号。通过长期采样,可以建立性能基线,当某一项指标偏离基线时就能更快发现异常。
五、与其他工具配合,形成完整排查链路
mpstat 解决的是“CPU 时间花在哪里”的问题,但它不会告诉你具体是哪个进程造成的。因此在实际故障诊断中,mpstat 通常与 pidstat、iostat、vmstat 搭配使用。比如当 mpstat 显示 %sys 很高时,可以运行 pidstat -d 1 查看哪些进程产生了大量系统调用或上下文切换;当 %iowait 高时,运行 iostat -x 1 查看具体磁盘的 await 和 %util;当 %soft 高时,通过 /proc/interrupts 和 ethtool 分析中断来源。
另外不要忽略虚拟化环境中的 %steal。如果云主机上的 mpstat 长期显示 %steal 超过 5%,说明宿主机资源紧张,或者同宿主机邻居负载过高。这种情况下在客户机内部做任何优化都很难有效果,需要与云服务商确认或迁移实例。Debian 的 mpstat 和 sar 都能正常报告 %steal,这是判断云主机性能是否被宿主机影响的重要依据。
总之,把 mpstat 作为每日巡检的第一步,能够快速建立 CPU 细分指标的感性认识。遇到波动时,结合其他 sysstat 工具深入分析,才能避免盲目重启或扩容。