有台服务器「一阵一阵地卡」:用户反馈页面偶尔转圈三五秒,可我登上机器跑 top,CPU 闲着、内存看着也正常------卡的那一刻偏偏不在 top 刷新的时候。
后来才懂,这就是 top 的局限:它是瞬间快照 工具,而间歇性瓶颈要连续采样看趋势才能抓到。干这活的,是「性能四件套」:vmstat、iostat、mpstat、sar。这篇讲它们各自盯哪块、输出怎么读、到什么数值算异常。
〇、先花两分钟:机器卡只有四种卡法
一台机器「慢」,拆开只有四种根因(先记住框架,四件套正好各管一块):
-
CPU 忙------计算把核占满了;
-
内存紧------不停换页(E1 的 si/so),时间浪费在磁盘倒腾内存上;
-
磁盘忙------IO 队列排长队,请求在等盘;
-
啥资源都没满,但进程在等------锁竞争、网络等待这类「不在监控面板上」的等待。
前三种各有指标可量化,第四种是 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的%usr95%、其他 7 个核%idle90%------单线程程序把一个核跑满了,整机「平均 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 历史
图示:四件套分工、vmstat/iostat 关键列判读