Linux Linux运维vmstat性能监控CPU内存I/O

Linux vmstat 系统监控命令指南

| 8 分钟阅读 | --

前言

vmstat 是 Linux/Unix 下常见的系统监控命令,可以按固定时间间隔展示 CPU、内存、swap、I/O 和系统调用相关指标。

top 更偏向查看进程不同,vmstat 更适合先看整台机器是否存在 CPU、内存或磁盘 I/O 压力。


一、基本用法

vmstat 常用两个数字参数:

vmstat <采样间隔秒> <采样次>

例如每 2 秒采集一次,只采集 1 次:

vmstat 2 1

示例输出:

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 196612      0 2745356    0    0   254   227    0    0  4  2 93  1  0

如果省略采样次数,就会一直持续采集:

vmstat 2

示例输出:

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 194712      0 2678196    0    0   254   227    0    0  4  2 93  1  0
 1  0      0 184416      0 2678408    0    0     0    35 5118 8075  2  2 96  0  0
12  0      0 194472      0 2678468    0    0     0    40 5478 8222  2  1 96  0  0

注意:vmstat 第一行通常是系统启动以来的平均统计,后续行才是按指定间隔采集的数据。排查实时问题时,建议重点看第二行开始的持续变化。


二、指标说明

vmstat 的输出可以按 procsmemoryswapiosystemcpu 六组来理解。

进程队列

指标含义性能关注点
r正在运行或等待 CPU 时间片的任务数如果 r 长期大于 CPU 核心数,说明 CPU 运行队列有积压,需要继续看 CPU 使用率和业务进程
b处于不可中断等待状态的任务数常见于等待磁盘 I/O、网络文件系统或内存交换等资源,持续偏高时要继续排查 I/O 和内存压力

内存

指标含义性能关注点
swpd已使用的 swap 大小swpd 不为 0 不一定立刻有问题,要结合 siso 是否持续活跃判断
free当前空闲物理内存大小不能只凭 free 判断内存是否不足,还要结合 cache、swap 活动和系统响应
buff块设备相关缓冲区大小一般不用单独盯这个值,更多是辅助理解系统缓存
cache文件系统页面缓存大小cache 大通常说明系统缓存了较多文件内容,如果 I/O 压力不高,一般是正常现象

swap

指标含义性能关注点
si每秒从 swap 读入内存的数据量长期不为 0 说明系统正在发生换入,通常意味着内存压力需要关注
so每秒从内存写入 swap 的数据量长期不为 0 说明系统正在发生换出,严重时会明显拖慢系统

判断 swap 时,不要只看 swpd,更要看 siso 是否持续有值。如果 swpd 有值,但 siso 长期为 0,说明当前不一定存在活跃的内存交换。

I/O

指标含义性能关注点
bi每秒从块设备读入的数据量如果 bibo 持续偏高,同时 wa 也高,通常要怀疑磁盘 I/O 瓶颈
bo每秒写入块设备的数据量持续写入很高时,要继续定位具体进程、日志、数据库或业务写入来源

bibo 高不一定单独代表异常。更可靠的判断方式是结合 wa、阻塞任务数、业务响应时间和磁盘设备指标一起看。

系统调用

指标含义性能关注点
in每秒中断次数,包含时钟中断数值持续异常偏高时,可能和设备中断、网络流量或系统负载有关
cs每秒上下文切换次数持续偏高可能说明线程切换频繁、锁竞争明显,或者系统调用压力较大

incs 越高,说明系统在中断处理和任务切换上消耗的资源越多。它们通常需要结合 CPU 的 sy 和业务线程模型一起判断。

CPU

指标含义性能关注点
us用户态 CPU 占用比例长期偏高时,优先排查业务进程、算法、线程和热点函数
sy内核态 CPU 占用比例偏高时可能和系统调用、上下文切换、网络或 I/O 相关
idCPU 空闲比例id 长期很低时,说明 CPU 资源紧张
waCPU 等待 I/O 完成的时间比例持续超过 20% 通常说明 I/O 等待已经比较明显
st虚拟化环境中被宿主机拿走的 CPU 时间比例在云主机或虚拟机中如果 st 持续偏高,需要关注宿主机资源争用

排查 CPU 时,可以先看 id 是否长期偏低,再看忙在 ussy 还是 wa。如果 us 高,多半要看应用;如果 sy 高,要看系统调用和内核态消耗;如果 wa 高,则优先往磁盘 I/O 方向排查。


三、推荐排查流程

  1. 先连续采样系统状态:

    vmstat 2 10

    从第二行开始看实时数据,不要只看第一行。如果 id 很低,说明 CPU 空闲少;如果 wa 高,说明 I/O 等待明显;如果 siso 持续不为 0,说明 swap 正在活跃。

  2. r 长期大于 CPU 核心数,并且 id 长期很低时,先定位 CPU 进程:

    top

    重点看哪个进程 %CPU 长期靠前。如果是业务进程,再继续看线程、日志或性能分析;如果 sy 也很高,要注意系统调用、上下文切换和内核态消耗。

  3. wa 持续偏高,或者 b 持续不为 0 时,继续定位磁盘 I/O:

    iostat -x 2 5
    iotop -o

    iostat 用来看是哪块磁盘忙,iotop 用来看哪个进程在读写。如果机器没有安装这些工具,也可以先用 vmstatbibo 判断读写是否持续偏高。

  4. siso 持续不为 0 时,先确认内存压力:

    free -h
    top

    看可用内存是否很低、swap 是否持续增长,以及是否有进程占用大量内存。swap 活跃时,即使 CPU 看起来不高,系统也可能明显变慢。

vmstat 适合先把问题方向分出来:CPU、内存、swap 还是 I/O。现场排查时,不要只看单个指标,最好连续采样几次,看它是不是持续增长或长期偏高。