性能排查 02|vmstat、iostat、mpstat、sar 怎么读?性能四件套的分工与判读阈值

有台服务器「一阵一阵地卡」:用户反馈页面偶尔转圈三五秒,可我登上机器跑 top,CPU 闲着、内存看着也正常------卡的那一刻偏偏不在 top 刷新的时候。

后来才懂,这就是 top 的局限:它是瞬间快照 工具,而间歇性瓶颈要连续采样看趋势才能抓到。干这活的,是「性能四件套」:vmstat、iostat、mpstat、sar。这篇讲它们各自盯哪块、输出怎么读、到什么数值算异常。

〇、先花两分钟:机器卡只有四种卡法

一台机器「慢」,拆开只有四种根因(先记住框架,四件套正好各管一块):

  1. CPU 忙------计算把核占满了;

  2. 内存紧------不停换页(E1 的 si/so),时间浪费在磁盘倒腾内存上;

  3. 磁盘忙------IO 队列排长队,请求在等盘;

  4. 啥资源都没满,但进程在等------锁竞争、网络等待这类「不在监控面板上」的等待。

前三种各有指标可量化,第四种是 E3 的分层定位法去挖。四件套分工:

工具 主战场 一句话
vmstat 内存 + 队列总览 一屏看全局,先跑它
iostat 磁盘 盯 %util 和 await
mpstat CPU 各核 看 %iowait 和单核瓶颈
sar 历史 把「过去一小时」倒出来看

其中 iostat / mpstat / sar 三个来自同一个包:

复制代码
sudo apt install sysstat

装完 sar 还要改一处才默认收历史数据(/etc/default/sysstat 里 ENABLED="false" 改成 "true",然后 sudo systemctl restart sysstat)------不改的话 sar 只能看当下,看不到过去。

图示:四件套分工、vmstat/iostat 关键列判读

一、vmstat:先跑它,一屏定方向

复制代码
vmstat 1 5

怎么读 :1 5 = 每秒采一次、共 5 次(必须连续采样,第一行是开机以来的平均值,忽略它)。关键列:

复制代码
procs -----------------memory------------- --swap-- ----io---- -system-- ----cpu-----
 r  b    swpd   free   buff  cache         si   so    bi    bo   in   cs us sy id wa st
 1  0       0 402300 123456 4321000        0    0    15    20  120  300  6  1 92  1  0
  • r:正在等 CPU 的进程数。持续大于核数 = CPU 排队(CPU 紧);

  • b:被磁盘 IO 卡住(不可中断睡眠)的进程数。持续 > 0 = 磁盘排队(IO 紧);

  • si/so:swap 进/出,持续非零 = 内存紧(E1 讲过);

  • us/sy/id/wa:CPU 时间四分账------用户态 / 内核态 / 空闲 / 等 IO(wa,iowait) 。wa 持续 > 10% 基本可以断定瓶颈在磁盘,不在 CPU。

一屏下来,四种卡法排除了几种、剩下几种,方向就有了。

二、iostat:磁盘到底忙不忙

复制代码
iostat -x 1 5

怎么读 :-x 出扩展统计,每秒一次共 5 次。别看列海,就盯三个:

复制代码
Device  r/s   w/s   rkB/s  wkB/s  await  %util
sda     2.00  8.00   40.0  160.0   1.85   0.50
  • await :每个 IO 请求的平均等待毫秒数(含队列时间)。机械盘 10ms 出头算正常水位,长期 > 20~30ms 说明盘响应慢或队列深;SSD 应该 < 1~2ms;

  • %util :采样期内设备有 IO 在处理的时间占比。持续 > 80% = 这块盘被打满了(注意:SSD 并行能力强,%util 高不一定真是瓶颈,结合 await 看;机械盘 %util 高基本就是瓶颈);

  • r/s、w/s:每秒读/写请求数,判断是读密集还是写密集。

我那个「一阵一阵卡」的案例最后就是 iostat 抓到的:%util 周期性冲到 99%,await 同步飙到 40ms+------某个定时任务每小时全量写一轮日志,磁盘被它独占几秒。

三、mpstat:CPU 的另一种忙法

复制代码
mpstat -P ALL 1 5

怎么读 :-P ALL 按核展开。两个看点:

  • %iowait:CPU 空闲但有事在等磁盘的比例------高 iowait 的锅在磁盘不在 CPU(和 vmstat 的 wa 同源);

  • 各核冷热不均 :8 个核,CPU0 的 %usr 95%、其他 7 个核 %idle 90%------单线程程序把一个核跑满了,整机「平均 CPU 使用率」只有 12%,但程序就是卡。这是 top 整体视图最容易漏掉的情况,只有按核展开才看得见。

top 里按 1 键也能按核展开 CPU 行------同一个信息,但 mpstat 适合连续采样记录。

四、sar:把「案发时不在场」变成「回放录像」

前面三个工具都得当时正在跑才有用,可故障往往发生在你没盯着的凌晨三点。sar 的价值:sysstat 装好并启用后,它每 10 分钟自动采一轮全量数据存起来,事后随取:

复制代码
sar -r                # 内存历史(今天)
sar -u                 # CPU 历史
sar -d                 # 磁盘历史
sar -r -f /var/log/sysstat/saXX   # 看每月 XX 号的历史(XX=日期两位数)

怎么读 :输出格式和 vmstat/iostat 同族(列名一致),区别是带时间戳的一长串 ------找异常时段直接看那一段的跳变。凌晨三点机器卡过?sar -u 里 03:10 那几个采样点 %iowait 40% 白纸黑字摆着。

五、和前后篇的关系

  • E1 的 free/si/so 是本篇 vmstat 的入门篇,判读口径一致;

  • 四件套定了「瓶颈在哪块资源」,E3 回答「这块资源上是谁在作怪」(CPU 线的分层定位法);

  • 手动四件套的巡检逻辑,E5 会打包成一个一键脚本。

速查表(文末收藏版)

复制代码
先跑谁              →  vmstat 1 5   (忽略第一行!那是开机以来的平均值)
CPU 排队            →  r 列持续 > 核数
磁盘排队            →  b 列持续 > 0 / wa 持续 > 10%
内存紧              →  si/so 持续非零
磁盘细查            →  iostat -x 1 5  盯 await 和 %util
                       await 机械盘>20~30ms / SSD>2ms 异常;%util 持续>80% 打满
单核瓶颈            →  mpstat -P ALL 1 5  看各核冷热不均
历史回放            →  sar -r / -u / -d   (sysstat 装后改 ENABLED="true" 才存历史)
装包                →  sudo apt install sysstat
四件套分工          →  vmstat 全局 / iostat 盘 / mpstat 核 / sar 历史
相关推荐
AR-26710-5 小时前
Linux Day16——日志
linux·运维
小HANN5 小时前
华为云企业网站上云实战|从零搭建高可用WordPress(ECS+RDS+ELB+弹性伸缩+云监控全流程落地)
linux·运维·服务器·经验分享
susplus6 小时前
【IMX6ULL Linux系统移植】SD卡分区 | uboot详解
linux·arm·u-boot
@三十一Y6 小时前
Linux:实现简易的shell
linux
2301_777998347 小时前
TCP连接断开:进程终止、主机断电与网络断开
linux·服务器·网络·tcp/ip
星恒随风7 小时前
Linux进程基础(二):进程调度、上下文切换、O(1)调度器、环境变量与虚拟地址空间
linux·笔记·学习·状态模式
xbzb7 小时前
一边装一边报错:CentOS 7 + LNMP 跑 ECShop 的常见故障与解法
linux·运维·centos
学linux的QQ蛋8 小时前
图解 Linux 驱动编译进内核的完整工作流程
linux·运维·服务器
承渊政道8 小时前
Linux网络学习【UDP Socket编程实战:网络命令与客户端访问Linux验证】
linux·网络·学习·ubuntu·编程实战·udp socket