主题
vmstat 命令详解:一眼看穿 CPU、内存、磁盘 I/O 的实时状况
本文是 Linux 命令速查 中
vmstat的从 0 到 1 详解。 目标:把vmstat --help里的每个选项、以及输出每一列讲清楚,多看几遍后,你在服务器上敲vmstat就知道该盯哪几列。 环境依据:procps-ng 3.3.17(Ubuntu 22.04 自带;RHEL/Rocky 同属 procps-ng,用法一致)。
一、命令是干什么的
vmstat(virtual memory statistics,虚拟内存统计)是一个一行命令同时汇报 CPU、内存、swap、磁盘 I/O、系统中断的轻量监控工具。它输出一行行数字,列很多,但每一列都对应一类系统健康指标。
- 不带参数:打印一行"开机到现在的平均值";
- 带
delay:每隔 delay 秒持续打印,第一行是开机以来的平均,后面每一行是距上一次的增量(最有诊断价值); - 带
delay count:采样 count 次后自动退出。
类比:
vmstat就像把"任务管理器里的 CPU 曲线、内存曲线、磁盘活动曲线"压缩成一行表格,每隔几秒刷一行,适合快速判断"系统现在到底卡在哪一类资源上"。
SRE 经典用法:vmstat 1 5,看 5 秒,重点看 r(等待运行的进程数)、wa(CPU 等磁盘的时间)、si/so(swap 换入换出)、us/sy/id。
二、命令语法
bash
vmstat [选项]... [delay [count]][选项]:可选,控制显示哪些分区(活动内存、slab、磁盘等)和格式;delay:可选,每隔多少秒采样一次;不写就只打印一行平均值;count:可选,采样多少次;不写就一直刷到Ctrl+C。
最简单的用法:
bash
vmstat 1 3三、选项全表(对照 vmstat --help)
1. 控制显示哪类统计
| 选项 | 中文含义 | 什么场景用 |
|---|---|---|
-a,--active | 显示 active/inactive(活跃/非活跃)内存 | 想看哪些内存页是热的 |
-f,--forks | 显示开机以来 fork 出来的进程总数 | 看进程创建总量 |
-m,--slabs | 打印 slab 分配器缓存信息 | 排查内核内存碎片/slab 占用 |
-s,--stats | 打印各类事件计数器汇总 | 看开机以来的累计统计 |
-d,--disk | 显示各磁盘的读写统计 | 看磁盘吞吐 |
-D,--disk-sum | 磁盘统计汇总成一个总数 | 不想按盘拆开时 |
-p 设备,--partition 设备 | 显示指定分区的统计 | 只盯某个分区 |
2. 控制输出格式
| 选项 | 中文含义 | 什么场景用 |
|---|---|---|
-n,--one-header | 只打印一次表头,不重复显示 | 持续刷新时输出更干净 |
-S 字符,--unit 字符 | 指定显示单位(如 k/K/m/M) | 脚本里固定单位 |
-w,--wide | 宽列输出(数字更宽、不挤) | 列多的时候防错列 |
-t,--timestamp | 每行前面加上时间戳 | 持续采样时标记时间点 |
四、由浅入深的典型示例
示例 1:基本用法,每 1 秒采 2 次
bash
vmstat 1 2text
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 3310828 15712 4426424 0 0 1 20 341 548 1 1 98 1 0
0 0 0 3307660 15712 4426436 0 0 0 76 2035 2827 2 1 97 0 0第一行 0 0 ... 98 1 0 是开机以来的平均值,参考意义不大;从第二行开始才是这 1 秒内的实时增量,重点看第二行。
示例 2:读懂每一列
输出按表头分五大块,逐块解释:
text
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy id wa stprocs(进程)块:
| 列 | 含义 | 怎么看 |
|---|---|---|
r | 等待 CPU 运行的进程数(运行队列) | 长期大于 CPU 核数,说明 CPU 不够用 |
b | 处于不可中断睡眠(通常在等磁盘)的进程数 | 非 0 常说明磁盘 I/O 阻塞 |
memory(内存)块,单位 KB:
| 列 | 含义 |
|---|---|
swpd | 已用掉的 swap 大小 |
free | 完全空闲的内存 |
buff | 块设备缓冲 |
cache | 页缓存 |
swap 块:
| 列 | 含义 | 怎么看 |
|---|---|---|
si | 每秒从磁盘换入内存的量(swap in) | 持续大于 0 说明内存吃紧,在频繁换入 |
so | 每秒从内存换出到磁盘的量(swap out) | 持续大于 0 说明在把内存数据挤到磁盘 |
si/so长期不为 0 是内存不足的经典信号,比free的数字更敏感。
io 块:
| 列 | 含义 |
|---|---|
bi | 每秒从块设备读入的块数(块默认 512B) |
bo | 每秒写到块设备的块数 |
system(系统)块:
| 列 | 含义 |
|---|---|
in | 每秒中断数 |
cs | 每秒上下文切换数 |
cs飙升通常意味着进程/线程频繁切换,可能是锁竞争或线程太多。
cpu 块,单位是百分比:
| 列 | 含义 | 怎么看 |
|---|---|---|
us | 用户态占用(应用程序) | 高说明应用在算 |
sy | 内核态占用 | 高说明系统调用/内核开销大 |
id | 空闲 | 越高越闲 |
wa | CPU 空闲但在等磁盘 I/O | 高说明磁盘是瓶颈,不是 CPU |
st | 被虚拟化偷走的时间 | 云主机上 >0 说明宿主在争抢 |
示例 3:只打印一次表头,持续刷新
bash
vmstat -n 1每 1 秒打印一行、只在最上面显示一次表头,不会被反复出现的表头刷屏;按
Ctrl+C停止。
示例 4:每行带时间戳
bash
vmstat -t 1 5每行前面追加当前时间,方便事后对照"几点几分系统开始抖动"。
示例 5:看 slab(内核缓存)占用
bash
vmstat -m输出内核 slab 分配器的各类缓存(如
dentry、inode、buffer_head)占用,排查"内存被内核吃掉但找不到进程用在哪"时用。
示例 6:看磁盘读写统计
bash
vmstat -d列出每个磁盘的读/写总数、合并次数等,轻量版的磁盘 IO 统计。
示例 7:看开机以来的事件汇总
bash
vmstat -s把"总共 fork 了多少进程、多少次中断、多少次上下文切换"等累计计数一次列出,适合做基线对比。
五、高频组合速记
| 命令 | 用途 |
|---|---|
vmstat 1 5 | 采样 5 秒,看实时状况(最常用) |
vmstat -n 1 | 干净地持续刷新 |
vmstat -t 1 10 | 带时间戳采样 10 秒 |
vmstat -m | 看内核 slab 占用 |
vmstat -d | 看磁盘读写总量 |
六、RHEL 系与 Debian 系差异
vmstat 属于 procps-ng,两系用法一致。细微差别:
- 输出列的顺序和含义两系相同;
- 容器/虚拟机里
st(steal)列才有意义,物理机上通常是 0; - 若 swap 没配置,
swpd/si/so全为 0,属正常。
七、新手易错点
- 盯着第一行平均值看:第一行是开机以来的平均,掩盖了当前抖动;一定要看第二行及以后的实时增量。
- 把
wa当成 CPU 忙:wa高恰恰是 CPU 在等磁盘,瓶颈在磁盘不在 CPU。 si/so偶尔为 0 就放心:要持续观察几秒;长期si/so > 0才是内存吃紧的信号。r列超过 CPU 核数不代表报错:是提醒你 CPU 可能成为瓶颈,需要进一步用mpstat -P ALL看每核。vmstat是只读命令,可放心使用:它只读/proc下的统计文件。- 单位是 KB:memory 块默认 KB,别当成字节。
八、相关命令与文档
- 速查页:Linux 命令速查
- 看内存:
free(详解见 free) - 看磁盘更细的 I/O:
iostat(详解见 iostat-iotop) - 看每个 CPU 核:
mpstat(详解见 mpstat-sar) - 历史性能数据:
sar(详解见 mpstat-sar) - 性能排查思路:见 Linux 性能专题