vmstat 命令详解与参数实测(Ubuntu 22.04)

vmstat 命令逐参数实测详解:procs/memory/swap/io/system/cpu 全列解读与“第一行是开机以来平均值”陷阱实证,-a 至 -w 全参数,附 dd 直通写、yes 死循环、内存分配三个压力实验,全部回显在 Ubuntu 22.04 实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行系统信息2026/10/15

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--activememory 区改显示 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 组为"每秒速率"):

组列实测值含义
procsr1等待 CPU 的可运行任务数(运行队列长度)
procsb0处于不可中断睡眠(通常在等块设备 I/O)的任务数
memoryswpd1571564已换出到 swap 的内存量(KiB)
memoryfree2463564完全空闲内存(判断内存够不够应结合 cache,见本专栏 free 篇)
memorybuff884204块设备元数据缓冲(对应 free 的 buffers)
memorycache31460904文件页缓存(对应 free 的 cache,含 SReclaimable)
swapsi0每秒从 swap 换入的内存量
swapso5每秒换出到 swap 的内存量(本次快照有少量换出活动)
iobi38每秒从块设备收到的块数
iobo2462每秒发送到块设备的块数(本次有后台写回)
systemin57每秒中断次数(含时钟中断)
systemcs18每秒上下文切换次数
cpuus18用户态时间占比
cpusy5内核态时间占比
cpuid76空闲占比
cpuwa1等待 I/O 的时间占比
cpust0被虚拟化环境"偷走"的时间占比(本机为 0,物理机/独占环境常见)

💡 技术拓展:CPU 时间的完整分类口径,vmstat 只展示其中五列,横向对照——

口径全称计入什么vmstat 列
ususer非优先级调整的用户态时间us
sysystem内核态时间sy
ididle空闲id
waiowaitCPU 空闲但有未完成块 I/O 的时间wa
ststeal虚拟化下被宿主偷走的时间st
hihardware irq硬中断时间不单列(并入 sy)
sisoftirq软中断时间不单列(并入 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 time 1792044994 是 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高(磁盘写+读回)配置了 swapvmstat 的 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"。

六、参考链接