vmstat 命令详解与参数实测(Ubuntu 22.04)
vmstat 命令逐参数实测详解:procs/memory/swap/io/system/cpu 全列解读与“第一行是开机以来平均值”陷阱实证,-a 至 -w 全参数,附 dd 直通写、yes 死循环、内存分配三个压力实验,全部回显在 Ubuntu 22.04 实测通过。
vmstat 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 vmstat 的每一个参数——默认输出的 procs/memory/swap/io/system/cpu 全列解读、
vmstat 1 3间隔采样(含"第一行是开机以来平均值"这个经典陷阱)、-a/-f/-s/-d/-p/-t/-S/-w/-D/-m/-n,并用 dd 直通写、4 个 yes 死循环、1.5G 内存分配三个压力实验实证 wa/b/r/si/so 的行为,全部命令与回显已在 Ubuntu 22.04(procps-ng 3.3.17)实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- vmstat 版本:procps-ng 3.3.17(
vmstat -V实测) - vmstat 属于 procps 软件包,Ubuntu 22.04 默认预装
- CPU 核数:12(
nproc实测);内存 40 GiB;swap 为 2 GiB 文件(/swapfile) - 演示数据:
/root/demo/vmstat/(dd 写盘演示目录,实验用临时文件已在实验内清理,收尾确认无残留进程) - 数据来源:vmstat 每次采样读取
/proc/meminfo、/proc/stat、/proc/vmstat、/proc/diskstats等内核接口,全程真实内核数据
二、命令概览
2.1 语法与测试数据准备
vmstat 的语法是 vmstat [options] [delay [count]]:delay 与 count 是位置参数(不是选项),分别表示采样间隔秒数与采样次数。vmstat 1 3 即每 1 秒采样一次、共 3 次;不带位置参数则输出一次快照。
三个压力实验的准备动作(均会在正文给出真实回显):
- IO 压力:
dd if=/dev/zero of=<演示文件> bs=1M count=2048 oflag=direct &直通写 2 GiB; - CPU 压力:4 个
yes > /dev/null &死循环(实验后 kill 清理); - 内存压力:
python3后台申请并持有 1.5 GiB 匿名内存 30 秒。
2.2 --help 全量输出
vmstat --help 输出全部参数清单(逐行照抄实测回显,退出码 0):
vmstat --help; echo rc=$?
Usage:
vmstat [options] [delay [count]]
Options:
-a, --active active/inactive memory
-f, --forks number of forks since boot
-m, --slabs slabinfo
-n, --one-header do not redisplay header
-s, --stats event counter statistics
-d, --disk disk statistics
-D, --disk-sum summarize disk statistics
-p, --partition <dev> partition specific statistics
-S, --unit <char> define display unit
-w, --wide wide output
-t, --timestamp show timestamp
-h, --help display this help and exit
-V, --version output version information and exit
For more details see vmstat(8).
rc=0
参数速查表:
| 参数 | 长选项 | 作用 |
|---|---|---|
delay count | — | 位置参数:每 delay 秒采样,共 count 次 |
-a | --active | memory 区改显示 inact/active 两列 |
-f | --forks | 显示开机以来的 fork 总数 |
-m | --slabs | 显示 slab 缓存明细 |
-n | --one-header | 间隔采样时只显示一次表头 |
-s | --stats | 显示内核事件计数清单 |
-d | --disk | 显示每块磁盘的读写统计 |
-D | --disk-sum | 磁盘统计的汇总形态 |
-p <dev> | --partition | 指定分区的读写统计 |
-S <char> | --unit | 内存显示单位:k/K/M/V(KiB/千字节/MiB 等) |
-w | --wide | 宽版输出(列距加大、数值对齐) |
-t | --timestamp | 每行末尾追加采样时间戳 |
2.3 版本信息
vmstat -V
vmstat from procps-ng 3.3.17
注意 vmstat 用的是 -V(短选项),同样接受 --version。
三、参数逐项实测
3.1 默认输出——三行结构逐列解读
无参数的 vmstat 输出一次快照,画面分三行:类别行、列名行、数据行:
vmstat
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 1571564 2463564 884204 31460904 0 5 38 2462 57 18 18 5 76 1 0
逐列解读(单位:memory/swap 组默认 KiB,io/system/cpu 组为"每秒速率"):
| 组 | 列 | 实测值 | 含义 |
|---|---|---|---|
| procs | r | 1 | 等待 CPU 的可运行任务数(运行队列长度) |
| procs | b | 0 | 处于不可中断睡眠(通常在等块设备 I/O)的任务数 |
| memory | swpd | 1571564 | 已换出到 swap 的内存量(KiB) |
| memory | free | 2463564 | 完全空闲内存(判断内存够不够应结合 cache,见本专栏 free 篇) |
| memory | buff | 884204 | 块设备元数据缓冲(对应 free 的 buffers) |
| memory | cache | 31460904 | 文件页缓存(对应 free 的 cache,含 SReclaimable) |
| swap | si | 0 | 每秒从 swap 换入的内存量 |
| swap | so | 5 | 每秒换出到 swap 的内存量(本次快照有少量换出活动) |
| io | bi | 38 | 每秒从块设备收到的块数 |
| io | bo | 2462 | 每秒发送到块设备的块数(本次有后台写回) |
| system | in | 57 | 每秒中断次数(含时钟中断) |
| system | cs | 18 | 每秒上下文切换次数 |
| cpu | us | 18 | 用户态时间占比 |
| cpu | sy | 5 | 内核态时间占比 |
| cpu | id | 76 | 空闲占比 |
| cpu | wa | 1 | 等待 I/O 的时间占比 |
| cpu | st | 0 | 被虚拟化环境"偷走"的时间占比(本机为 0,物理机/独占环境常见) |
💡 技术拓展:CPU 时间的完整分类口径,vmstat 只展示其中五列,横向对照——
口径 全称 计入什么 vmstat 列 us user 非优先级调整的用户态时间 us sy system 内核态时间 sy id idle 空闲 id wa iowait CPU 空闲但有未完成块 I/O 的时间 wa st steal 虚拟化下被宿主偷走的时间 st hi hardware irq 硬中断时间 不单列(并入 sy) si softirq 软中断时间 不单列(并入 sy) 注意 vmstat 的 swap 组 si 列与 CPU 的 softirq si 无关,前者是 swap 换入速率、后者是中断时间口径,重名但完全两回事。mpstat(sysstat 包)可以把 hi/si 单列出来。
3.2 vmstat 1 3 间隔采样(含第一行陷阱)
vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 1571564 2463564 884204 31460904 0 5 38 2462 57 18 18 5 76 1 0
0 0 1571564 2474712 884220 31461040 32 0 148 13752 9398 9995 2 1 97 0 0
0 0 1571564 2471420 884240 31461048 0 0 144 12440 8356 9106 1 1 98 0 0
最重要的陷阱在这里:第 1 行是自开机以来的平均值,第 2 行起才是各间隔内的实时值。证据就在实测数据里——第 1 行 us=18、cs=18(开机至今的长期均值),而第 2、3 行 us=2/1、cs=9995/9106(当前实时);第 1 行的 r=2 也只是"开机以来可运行任务的平均数",不代表当下。看实时状态必须从第 2 行开始读。
其余实测要点:delay/count 都是位置参数,vmstat 1 3 无需 -s 之类的选项;不带 count 时 vmstat 1 会无限采样,Ctrl-C 退出。
3.3 -a(--active):active/inactive 内存
vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
1 0 1571564 2471420 24518208 10122288 0 5 38 2462 57 18 18 5 76 1 0
-a 把 memory 组的 buff/cache 两列换成 inact/active:实测 inact 24.5 GiB、active 10.1 GiB。inact(不活跃页)是内存紧张时优先回收的对象——本机大量页缓存处于不活跃状态,这正是 free 篇中 available 远大于 free 的内核依据。排查"内存被什么占了"时,active 持续偏高说明工作集真的在变大,而 inact 占大头则基本是可回收缓存。
3.4 -f(--forks):开机以来的 fork 总数
vmstat -f
1141595 forks
vmstat -f
1141596 forks
两次调用数字从 1141595 涨到 1141596——期间恰好新建了一个进程,计数器实时递增。-f 统计的是 fork/vfork/clone 系统调用的累计次数,可用来估算系统的进程创建强度(对比开机时长即平均每秒 fork 数)。
3.5 -s(--stats):内核事件计数清单
vmstat -s
41027992 K total memory
6211284 K used memory
10122244 K active memory
24518208 K inactive memory
2471420 K free memory
884240 K buffer memory
31461048 K swap cache
2097148 K total swap
1571564 K used swap
525584 K free swap
6517956 non-nice user cpu ticks
537 nice user cpu ticks
1223988 system cpu ticks
27407929 idle cpu ticks
258232 IO-wait cpu ticks
0 IRQ cpu ticks
476646 softirq cpu ticks
0 stolen cpu ticks
13792105 pages paged in
883464249 pages paged out
38655 pages swapped in
421190 pages swapped out
450065285 interrupts
436075554 CPU context switches
1792044994 boot time
1141597 forks
这份清单是一次性拿到全部内存/CPU/分页计数的便捷途径,几个亮点:
swap cache一行(31461048 K)就是 free 篇对账过的 Cached+SReclaimable 口径,vmstat 的叫法容易让人误以为是"swap 用的缓存",实际是页面缓存;boot time1792044994 是 Unix 时间戳,换算即 2026-10-15 06:16:34(UTC),与本专栏 uptime 篇uptime -s(06:16:35)在秒级粒度一致——多工具交叉验证开机时间的又一路径;pages swapped in/out(38655/421190)是开机以来的页数累计,而快照里 si/so 是每秒速率,一个是存量一个是流量;stolen cpu ticks为 0 对应 3.1 的 st 列为 0。
3.6 -d(--disk):磁盘统计
vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
loop0 14 0 34 37 0 0 0 0 0 0
loop1 52 0 2164 43 0 0 0 0 0 0
loop2 59 0 2204 114 0 0 0 0 0 0
loop3 299 0 7258 106 0 0 0 0 0 0
loop4 52 0 2150 40 0 0 0 0 0 0
loop5 58 0 2220 49 0 0 0 0 0 0
loop6 50 0 2164 37 0 0 0 0 0 0
loop7 58 0 2202 73 0 0 0 0 0 0
sda 856128 256892 27394514 1340021 25183486 6521705 1766924922 30243967 0 2343
sr0 0 0 0 0 0 0 0 0 0 0
loop8 506 0 15610 166 0 0 0 0 0 0
loop9 185 0 2750 86 0 0 0 0 0 0
loop10 69 0 2530 45 0 0 0 0 0 0
loop11 47 0 710 45 0 0 0 0 0 0
loop12 41 0 690 64 0 0 0 0 0 0
loop13 43 0 690 26 0 0 0 0 0 0
loop14 835 0 66798 676 0 0 0 0 0 0
loop15 35 0 590 21 0 0 0 0 0 0
loop16 18 0 102 41 0 0 0 0 0 0
loop17 2182 0 78830 146 384 226 94968 2068 0 2
loop18 0 0 0 0 0 0 0 0 0 0
每块磁盘一行,reads/writes 各五列(total 总次数、merged 合并次数、sectors 扇区数、ms 累计耗时毫秒),IO 组两列(cur 进行中的 I/O 数、sec 累计 I/O 秒数)。实测解读:sda 是真正的数据盘——读 85.6 万次、写 2518 万次、累计写 17.7 亿扇区(约 845 GiB 的历史写入量);loop 设备多为只挂载未使用,读写计数很小;sr0 是光驱,全 0。merged 列反映 I/O 调度器的合并效率(sda 写合并 652 万次)。
3.7 -p sda3(--partition):分区统计
vmstat -p sda3
sda3 reads read sectors writes requested writes
855771 27377122 25183483 1766924912
-p 需要跟分区名(这里取根分区所在的 sda3):reads/read sectors/writes/requested writes 四列。对比 3.6 的 sda 整盘行:reads 856128 vs 分区 855771、writes 25183486 vs 25183483——绝大多数 I/O 落在 sda3 这一个分区上,其余分区的贡献只有个位数,说明 I/O 热点集中。
3.8 -t(--timestamp):带时间戳采样
vmstat -t 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
r b swpd free buff cache si so bi bo in cs us sy id wa st UTC
1 0 1571564 2471420 884240 31461052 0 5 38 2462 57 18 18 5 76 1 0 2026-10-15 14:40:04
0 0 1571564 2476420 884272 31461324 0 0 152 12404 8959 9617 1 1 98 0 0 2026-10-15 14:40:05
0 0 1571564 2473136 884292 31461364 0 0 100 12436 9383 10041 1 1 97 0 0 2026-10-15 14:40:06
-t 在每行末尾追加 UTC 时间戳列,配合 delay count 长跑采集时可以直接对齐日志时间线,采集归档场景建议常开。
3.9 -S M / -S k:内存显示单位
vmstat -S M
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 1534 2415 863 30723 0 0 38 2462 57 18 18 5 76 1 0
vmstat -S k
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 1609281 2532491 905515 32216436 0 5 38 2462 57 18 18 5 76 1 0
-S 只影响 memory/swap 组的显示单位:-S M 时 swpd 1534(MiB)、cache 30723(MiB);-S k(默认口径)时为 KiB。两块回显是不同时刻的采样,数值本身有波动属正常(见 Q7)。可用字符:k/K(KiB/KB)、m/M(MiB/MB)等,大写对应十进制(KB/MB),小写对应二进制(KiB/MiB)。
3.10 -w(--wide):宽版输出
vmstat -w
--procs-- -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 1044460 33227888 1318384 2600544 1 5 39 2423 74 39 18 5 77 1 0
-w 加宽列距,七八位数的 swpd/free/cache 不再挤在一起,贴表格、写报告时可读性明显更好。这次快照也直观展示了共享内核环境的状态变化:与 3.1 相比页面缓存从 31460904 KiB(约 30 GiB)回落到 2600544 KiB(约 2.5 GiB)、free 从 2463564 涨到 33227888、swpd 从 1571564 降到 1044460——内核在两次实测之间回收了大量缓存(这也再次说明单点快照不可靠,见 Q7)。
3.11 -D(--disk-sum):磁盘统计汇总
vmstat -D
21 disks
3 partitions
945331 total reads
291984 merged reads
28556722 read sectors
1363888 milli reading
25402493 writes
6803277 merged writes
1782317434 written sectors
30330911 milli writing
0 inprogress IO
2372 milli spent IO
-D 是 3.6 全表 disk 的"合计视图":21 块盘、3 个分区,读写总量一眼可见(写 17.8 亿扇区、进行中 I/O 为 0——当时无排队)。要快速回答"这台机器磁盘累计干了多少活"用 -D,要定位哪块盘忙用 -d。
3.12 -m(--slabs):slab 缓存明细
vmstat -m | head -10
Cache Num Total Size Pages
ovl_inode 20959 34892 720 22
nf_conntrack_expect 0 0 224 36
nf_conntrack 961 1088 256 32
ext4_groupinfo_4k 6556 6556 184 22
fsverity_info 0 0 272 30
fscrypt_inode_info 0 0 136 30
MPTCPv6 15 15 2112 15
request_sock_subflow_v6 0 0 384 21
ip6-frags 0 0 184 22
-m 列出内核 slab 分配器按对象类型的占用(Cache 名称 / Num 活跃对象 / Total 分配对象 / Size 单对象字节 / Pages 占用页数)。排查内核内存(非进程内存)占用时用它,比如连接跟踪表 nf_conntrack 涨大就是这里的经典发现。输出较长(数十行),通常配合 head/grep 使用。
3.13 -n(--one-header):采样只显示一次表头
vmstat -n 1 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 1044460 33211788 1318384 2600544 1 5 39 2423 74 39 18 5 77 1 0
0 0 1044460 33222876 1318388 2600572 0 0 0 13384 7032 7925 0 0 99 0 0
默认间隔采样每一轮都重复表头;-n 只在开头显示一次表头,后续仅输出数据行——把采集结果喂给 awk/画图脚本时更省事(对照 3.2 可见默认形态的多余表头)。
3.14 无效参数与退出码
vmstat --bogus >/dev/null 2>&1; echo rc=$?
rc=1
无效参数时 vmstat 向 stderr 报错并退出 1;--help 则退出 0(见 2.2),脚本可据此判断调用是否合法。
四、实战示例
4.1 巡检三行看趋势(记得跳过第一行)
vmstat 1 3
(回显见 3.2。)读法口诀:第一行是开机以来平均值,直接跳过;从第 2 行起看实时。本例第 2 行 si=32(有少量换入)、bo=13752(写回活跃)、cs≈1 万(切换频繁)——都是瞬时活动,结合多行趋势判断才有意义。
4.2 IO 压力实证:dd 直通写把 bo 冲上 46 万
后台起 dd if=/dev/zero of=/root/demo/vmstat/blob.bin bs=1M count=2048 oflag=direct 直通写 2 GiB,写盘进行中采样:
vmstat 1 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 1571564 2477324 884336 31461656 0 5 38 2466 57 18 18 5 76 1 0
1 0 1571564 2480420 884352 31461824 0 0 148 464896 19516 26830 2 5 89 5 0
0 0 1571564 2481400 884352 31461968 0 0 144 0 7822 8915 0 0 99 0 0
0 0 1571564 2463900 884384 31462156 44 0 180 12896 11263 12912 2 2 96 0 0
0 0 1571564 2428744 884392 31462324 0 0 136 132 8498 9465 1 1 98 0 0
dd rc=0
第 2 行(写盘进行中)vs 其他行:bo 从 2466 冲到 464896 块/秒(约 228 MiB/s 的直通写入),sy 从 5 涨到 5%→系统态(发 I/O 也有开销)、wa 到 5%、in/cs 翻倍——直通写绕过页缓存、每笔都真正落盘的代价一目了然。第 3 行 bo=0 是 dd 在两笔大 I/O 之间的间隙。实验结束演示文件已删除(ls /root/demo/vmstat/ 为空)。
值得注意:本次实验中 b 列始终为 0——直通写进程大部分时间保持可运行(r=1),并没有长时间阻塞。b 的典型非零场景是大量进程同时阻塞在慢速块设备上(如设备 hang 住、海量并发读盘),理解口径即可,不必强求实验复现。
4.3 CPU 压力实证:4 个死循环把 r 顶到 4~5
起 4 个 yes > /dev/null &(12 核机器上占 4 个核),8 秒后采样:
vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
5 0 1571564 2393372 884480 31462500 0 5 38 2467 58 19 18 5 76 1 0
4 0 1571308 2383644 884492 31462500 120 0 120 12512 13371 10133 16 21 63 0 0
4 0 1571308 2382584 884496 31462500 0 0 0 48 12639 9720 15 21 64 0 0
(实验后已 kill 清理,收尾 ps aux | grep -c '[y]es' 为 0。)
解读:第 1 行 r=5 还是历史均值;第 2、3 行 r=4 正是 4 个死循环,us+sy=37%(16+21)——4 核被吃满(37%×12 核 ≈ 4.4 核),id 从 76 掉到 63。r 持续高于空闲核数即 CPU 排队。有意思的是第 2 行出现 si=120(换入 120 KiB/s):CPU 满转时内核顺带把一些换出页换了回来,swpd 也从 1571564 降到 1571308——swap 活动不一定来自内存紧张,也可能是内核的正常调度。
4.4 内存压力实证:1.5G 匿名内存申请,si/so 为什么还是 0
后台 python3 申请并持有 1.5 GiB 匿名内存 30 秒,持有期间采样:
vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 1571308 838436 884508 31462520 0 5 38 2466 58 19 18 5 76 1 0
1 0 1571308 835264 884524 31462772 4 0 12 328 18854 27621 2 3 96 0 0
0 0 1571308 835264 884524 31462804 0 0 0 0 7360 8581 0 0 100 0 0
free -m
total used free shared buff/cache available
Mem: 40066 7661 815 65 31589 31741
Swap: 2047 1534 513
free 从 2.47 GiB 跌到 0.83 GiB(1.5G 匿名内存被吃掉),但 si/so 基本为 0(仅瞬时 si=4)、swpd 纹丝不动。原因是:本机还有 31.5 GiB 的页面缓存(available 31741 MiB),内核面对内存申请优先回收页缓存而不是换出匿名页——回收缓存比磁盘换页便宜得多。
💡 技术拓展:内存紧张时内核的三种手段,横向对比——
手段 代价 前提 观测位置 回收页缓存(clean/dirty page) 低(干净页直接丢弃) 存在可回收缓存 free 的 cache 下降 换出匿名页到 swap 高(磁盘写+读回) 配置了 swap vmstat 的 so/si 上升 OOM 杀进程 最高 连缓存和 swap 都不够 内核日志 oom-killer 只有缓存被榨干后 swap 才会真正动起来。这也是"swpd 高不可怕、si/so 持续非零才可怕"的原理依据。
4.5 swap 压力判断口诀(综合三个实验)
- swpd 高 ≠ 有压力:本机 swpd 长期 1.5 GiB,但 si/so 大多为 0,只是历史驻留;
- si/so 偶发小值(几~几十 KiB/s):内核正常调度,如 4.3 的 si=120;
- si/so 持续大值:真·swap 压力,伴随 wa 升高、cs 上升——加内存或查内存泄漏;
- 配合
-t时间戳长时间采集(vmstat -t 5 720一小时),把 si/so/wa 三列画成曲线最直观。
五、注意事项与常见问题
Q1:vmstat 输出的第一行为什么和其他行不一样? 第一行是自开机以来的平均值(所有计数的均值),第 2 行起才是各采样间隔内的实时值(3.2 实测对比过 us/cs/r 的差异)。只看实时状态时跳过第一行,这是 vmstat 最经典的误读点。
Q2:memory 组的 buff/cache 与 free 命令的对应关系? vmstat 的 buff=free 的 buffers 列、cache=free 的 cache 列(含 SReclaimable);si/so 与 swap 相关但单位是"每秒速率"。两工具同读 /proc/meminfo,数值可互相验证(见本专栏 free 篇对账)。
Q3:wa 高说明什么? CPU 空闲但有未完成的块 I/O——瓶颈在磁盘不在 CPU。本机 dd 直通写时 wa 冲到 5%(4.2);若 wa 长期 >20%,优先查磁盘与 I/O 调度,而不是升级 CPU。注意 wa 属于"id 的子集"(CPU 物理上是闲的)。
Q4:r 列多高算饱和? 相对核数:r 持续接近或超过核数(本机 12 核)即排队。r 瞬时尖峰(如定时任务并起)不必紧张,看持续值。r 高且 us 高是计算饱和;r 高且 wa 高是 I/O 饱和(4.2/4.3 两种形态实测过)。
Q5:st 列是什么?什么时候看它? st(steal time)是被虚拟化层偷走的 CPU 时间。物理机/独占环境通常为 0(本机实测为 0);公有云虚机上 st 持续 >5% 说明宿主超卖严重,可作换实例的依据。
Q6:-S 单位对哪些列生效? 只影响 memory 组(swpd/free/buff/cache 或 inact/active)与 swap 组的显示;io/system/cpu 组是速率与百分比,不受影响。大写 K/M 为十进制、小写 k/m 为二进制(3.9 实测)。
Q7:两次快照数值差别很大,是故障吗?
大概率是内核的正常动态:页缓存随文件读写涨落、偶发的换入换出(3.10 与 3.1 的对比即是实例)。共享内核的运行环境里波动更明显。结论:单点快照不可信,用 vmstat -t 1 60 这类带时间戳的连续采样看趋势。
Q8:vmstat 采不到网络 I/O?
vmstat 的 io 组只覆盖块设备(bi/bo),网络流量用 sar -n DEV(sysstat)或 ip -s link 观察。别把 bo 当成"总 I/O"。
六、参考链接
- procps-ng 项目主页(vmstat 源码所属项目):https://gitlab.com/procps-ng/procps
- Ubuntu 22.04 vmstat(8) 在线手册页:https://manpages.ubuntu.com/manpages/jammy/en/man8/vmstat.8.html
- proc(5) 手册页(/proc/stat、/proc/vmstat、/proc/diskstats 字段定义):https://man7.org/linux/man-pages/man5/proc.5.html
- Red Hat 性能调优文档——iowait/steal 的解读:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/monitoring_and_managing_system_status_and_performance/index
- 同族对比参见本专栏《uptime 命令详解与参数实测(Ubuntu 22.04)》《free 命令详解与参数实测(Ubuntu 22.04)》《tload 命令详解与参数实测(Ubuntu 22.04)》