CPU 卡顿时必看!mpstat:堪比瑞士军刀的性能工具,精准定位负载问题
它是 Linux 系统上 Sysstat 工具包中的一个组件,能提供详尽到每个 CPU 核心的性能数据,是系统管理员和运维工程师进行性能排查的必备工具。它就像一个专业的汽车仪表盘,不仅告诉你车速(整体CPU使用率),还告诉你发动机转速(%usr)、变速箱状态(%sys)、是否在等待燃油喷射(%iowait)以及是否有外部阻力(%steal)。的输出,看所有核心的利用率是否大致均匀。如果负载不均,可
CPU 卡顿时必看!mpstat:堪比瑞士军刀的性能工具,精准定位负载问题
在服务器突然变慢、应用响应延迟时,我们第一个怀疑的对象往往是 CPU。是 CPU 跑满了吗?是哪个核心在忙?是用户程序还是系统内核在消耗资源?是否存在不合理的等待?要回答这些问题,你需要一个能深入挖掘 CPU 性能数据的工具。
mpstat(Multiprocessor Statistics)正是这样一把利器。它是 Linux 系统上 Sysstat 工具包中的一个组件,能提供详尽到每个 CPU 核心的性能数据,是系统管理员和运维工程师进行性能排查的必备工具。
一、工具安装与基本启动
mpstat 包含在 sysstat 软件包中,大多数 Linux 发行版都默认不安装。
在不同系统下的安装方法
- Debian / Ubuntu
sudo apt update sudo apt install sysstat - CentOS / RHEL / Fedora
# CentOS/RHEL sudo yum install sysstat # 或者使用 dnf (较新版本) sudo dnf install sysstat # Fedora sudo dnf install sysstat - 其他类 UNIX 系统
- FreeBSD: 使用 pkg 安装
sysutils/sysstat。 - macOS: 可以通过 Homebrew 安装
sysstat。
- FreeBSD: 使用 pkg 安装
安装后注意:在一些系统上,sysstat 的服务默认可能未启动。数据收集由 sadc 工具完成,通常由 cron job 调度。对于实时诊断,直接使用 mpstat 即可,无需启动服务。
基本启动命令
直接运行,查看所有 CPU 的聚合平均数据
最简单的命令会输出自系统启动以来所有 CPU 的平均利用率快照。
mpstat
输出示例:
Linux 5.4.0-xx-generic (hostname) 08/28/2023 _x86_64_ (4 CPU)
10:30:00 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:30:00 AM all 8.20 0.01 1.93 0.03 0.00 0.02 0.00 0.00 0.00 89.81
指定间隔和次数,进行实时监控
这是最常用的模式,可以持续观察 CPU 利用率的变化。
# 每 2 秒输出一次数据,共输出 5 次
mpstat 2 5
二、输出结果解读:各列信息的含义
理解每一列的含义是正确诊断问题的关键。
- CPU: CPU 编号。
all表示所有 CPU 的平均值,0,1,2… 表示具体的逻辑 CPU 核心。 - %usr: 用户空间进程消耗的 CPU 百分比(运行应用程序代码)。
- %nice: 优先级被调高(nice)的用户进程消耗的 CPU 百分比。
- %sys: 内核空间进程消耗的 CPU 百分比(系统调用、中断处理等)。%usr + %sys 可以大致看出 CPU 的繁忙程度。
- %iowait: 非常重要的指标。表示 CPU 等待 I/O 操作(如磁盘、网络)完成所空闲的时间百分比。如果此值持续过高(如 >20%),通常意味着磁盘或网络 I/O 存在瓶颈,CPU 在空等数据。
- %irq: 处理硬件中断所花费的 CPU 时间百分比。
- %soft: 处理软件中断所花费的 CPU 时间百分比(如网络包处理、定时器等)。网络流量很大的服务器,此值可能会较高。
- %steal: 在虚拟化环境中,被宿主机(Hypervisor)“偷走”的 CPU 时间百分比。表示你的虚拟机因为其他虚拟机在运行而无法运行的时间。此值过高说明宿主机资源过度超售,你的 VM 正在挨饿。
- %guest: 运行虚拟处理器(guest OS)所花费的 CPU 时间百分比。
- %idle: CPU 空闲时间的百分比。
理解不同时间间隔的意义
- 短间隔(如 1 秒): 捕获 CPU 利用率的瞬时峰值和波动,适合排查偶发的、短时的性能抖动。
- 长间隔(如 10 秒): 得到 CPU 利用率的平均值和整体趋势,更适合观察长期负载和整体瓶颈。
三、常用选项及功能:精准定位问题
mpstat 的强大在于其丰富的选项,让你可以多维度切片数据。
查看每个单独 CPU 核心的统计信息
默认的 all 平均值可能会掩盖单个核心过载的问题。使用 -P ALL 可以揭示不平衡的负载。
# 每台秒刷新,显示所有核心的详细数据
mpstat -P ALL 2
输出示例:
...
10:35:00 AM CPU %usr %nice %sys %iowait %idle
10:35:00 AM 0 5.00 0.00 1.00 0.00 94.00
10:35:00 AM 1 20.00 0.00 3.00 0.00 77.00 <-- CPU1 非常忙!
10:35:00 AM 2 3.00 0.00 0.00 0.00 97.00
10:35:00 AM 3 4.00 0.00 1.00 0.00 95.00
这清楚地显示 CPU1 是瓶颈,可能是一个单线程应用在疯狂运行。
只查看特定核心
# 只查看 CPU0 和 CPU2
mpstat -P 0,2 2
与 -u 结合使用,显示更简洁的输出(通常默认已启用)
四、结合实际应用场景:解决真实问题
场景 1:服务器响应缓慢,初步定位问题方向
$ mpstat 2 3
观察输出:
- 如果 %usr + %sys 很高(>90%): 问题是 CPU 计算瓶颈。接下来需要用
pidstat或top找出是哪个进程。 - 如果 %iowait 很高: 问题是 I/O 瓶颈(磁盘或网络)。接下来需要用
iostat或iotop进一步排查磁盘 I/O。 - 如果 %steal 很高(虚拟机上): 问题是 宿主机资源竞争。你需要联系云服务商或宿主机管理员。
- 如果 %soft 很高: 可能是网络中断处理负载过高,需要优化网络或尝试中断平衡(IRQ balancing)。
场景 2:排查单线程应用性能问题
一个单线程应用只能在一个 CPU 核心上运行。即使系统整体 CPU 空闲,该应用也可能因为占满一个核心而达到性能极限。
使用 mpstat -P ALL 2,你会发现其中一个核心的 %usr 接近 100%,而其他核心非常空闲。这证实了应用是单线程的,并且它的性能受限于单核性能。
场景 3:评估系统负载是否均衡
在多线程应用中,观察 mpstat -P ALL 的输出,看所有核心的利用率是否大致均匀。如果负载不均,可能意味着应用的线程调度或任务分配算法有待优化,或者需要考虑进行 CPU 绑核(CPU affinity)设置。
五、与其他工具对比和结合使用
与 top/htop 对比
- top/htop: 提供的是一个进程视角的动态列表。优点是能快速找出最耗资源的进程。
- mpstat: 提供的是一个 CPU 视角的详细指标分解。优点是能精确量化 CPU 时间花在了哪里(用户、系统、等待I/O等),尤其是
%iowait和%steal等指标是 top 无法直接提供的。
与 pidstat 结合使用
这是性能分析的黄金组合。
- 第一步:用
mpstat发现宏观问题(e.g., CPU0 的 %usr 持续 100%)。 - 第二步:用
pidstat -u -p <PID> 2或pidstat -u -t 2监控特定进程或线程的 CPU 使用情况,定位到是哪个具体的进程或线程导致了 CPU0 的繁忙。
与 iostat 结合使用
当 mpstat 发现高 %iowait 时,立即使用 iostat -xz 2 来确认是哪个磁盘设备存在 I/O 瓶颈,并查看其读写速率、await、util 等指标。
总结
mpstat 可能没有 top 那样直观的动态界面,但它提供的精细化、多维度的 CPU 性能数据是无可替代的。它就像一个专业的汽车仪表盘,不仅告诉你车速(整体CPU使用率),还告诉你发动机转速(%usr)、变速箱状态(%sys)、是否在等待燃油喷射(%iowait)以及是否有外部阻力(%steal)。
掌握 mpstat,你就能在遇到性能问题时,不再是盲目猜测,而是能够数据驱动地、一步到位地直击问题根源。下次服务器告警响起时,别忘了一键 mpstat -P ALL 2,让它为你揭示 CPU 的真相。
更多推荐



所有评论(0)