5 分钟上手 vmstat
本页承诺:5 分钟内用一行数字判断瓶颈的大方向——CPU 不够?内存不足在 swap?卡在磁盘 IO?还是上下文切换爆炸?vmstat 自带、免安装,是排查的"第一眼"。
阅读时间约 4 分钟 + 动手 3 条命令。完整版见 vmstat 使用教程。
第 1 步:确认有 vmstat
bash
which vmstat # 输出路径即已安装(procps 包自带,几乎都装了)第 2 步:跑起来
bash
vmstat 1 # 每 1 秒刷新一屏(最常用)不用造靶子——vmstat 看整机,直接在任意负载下观察即可。想压力更大,可以后台跑着 demos/cpu-demo 的场景 1/2/3 再看。
第 3 步:按列判方向
输出长这样(忽略第一行,从第二行看):
bash
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 1047000 20480 800100 0 0 0 1024 310 1200 15 25 59 1 0四个区域各看一个关键点:
| 区域 | 关键列 | 异常信号 | 含义与下一步 |
|---|---|---|---|
| procs | r / b | r 持续 > CPU 核数 = CPU 过载,任务排队;b 持续 >0 = 卡在 IO | r 高→perf 看热点;b 高→iostat |
| memory | si / so | 持续非 0 = 内存不足的铁证,在换页 | 加内存/优化内存占用 |
| swap | 同上 | 同上(与 memory 合并看) | — |
| io | bi / bo | 数值大 = 磁盘读写量大 | 结合 wa 看是否拖累 |
| system | cs / in | cs 异常高(数十万级)= 线程过多/锁竞争;in 高 = 中断多(网络繁忙) | cs 高→perf 调度分析 |
| cpu | us / sy / wa / id | 见下表 | — |
cpu 区 4 列判读(最常用的判断):
| 列 | 含义 | 高说明什么 |
|---|---|---|
us | 用户态 | 业务/计算,→ perf 看用户态函数 |
sy | 内核态 | 频繁系统调用/锁/缺页,→ strace |
wa | 等 IO | 磁盘瓶颈,→ iostat 看到哪块盘 |
id | 空闲 | 高但程序慢 → CPU 不是瓶颈,查内存/IO/锁 |
常见坑(3 秒自查)
| 现象 | 原因 | 解决 |
|---|---|---|
| 第一行数值巨大/和后面完全不像 | 第一行是开机以来累计平均,不是实时值 | 直接忽略,从第二行看 |
| 列对不齐看不清 | 默认格式窄 | vmstat -w 1 宽格式 |
free 看着很小,是不是内存不够? | page cache 占了 cache | 别只看 free,看 si/so 是否持续非 0,或 free -h 的 available |
深度入口
- vmstat 使用教程—— 每个字段详解、
/proc/stat数据来源、实验数据 - 5 分钟上手 iostat——
wa/b高时到设备级确认 - 5 分钟上手 strace——
sy高时抓系统调用 - 5 分钟上手系列
一句话总结:vmstat 三步 = vmstat 1 刷新 → 忽略第一行 → 按 r/b(排队)、si/so(换页)、cs(上下文切换)、us/sy/wa(CPU 类型)判方向,5 分钟锁定瓶颈在 CPU、内存还是 IO,再换专项工具深入。