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

安装后注意:在一些系统上,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 计算瓶颈。接下来需要用 pidstattop 找出是哪个进程。
  • 如果 %iowait 很高: 问题是 I/O 瓶颈(磁盘或网络)。接下来需要用 iostatiotop 进一步排查磁盘 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 结合使用
这是性能分析的黄金组合

  1. 第一步:用 mpstat 发现宏观问题(e.g., CPU0 的 %usr 持续 100%)。
  2. 第二步:用 pidstat -u -p <PID> 2pidstat -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 的真相。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐