1. 命令概述与核心价值
vmstat(Virtual Memory Statistics)是我在Linux系统性能排查时最常使用的"瑞士军刀"之一。这个看似简单的命令行工具,实际上能提供从CPU负载到内存压力、从磁盘I/O到进程状态的全局视角。记得去年处理过一例线上服务卡顿问题,正是通过vmstat快速定位到内存交换(swapping)导致的性能瓶颈。
与top/htop这类交互式工具不同,vmstat的特点在于:
- 轻量级:几乎不消耗系统资源,适合在生产环境持续运行
- 快照式监控:通过时间间隔参数实现周期性采样
- 多维指标关联:单条命令同时观察CPU、内存、I/O的关联变化
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 完整语法与参数解析
2.1 基础语法规范
bash复制vmstat [options] [delay [count]]
- delay:采样间隔秒数(默认只输出一次启动以来的平均值)
- count:采样次数(不指定则持续输出)
注意:首次输出的数据是系统启动以来的累计平均值,后续输出才是实时快照。这在分析瞬时性能问题时需要特别注意。
2.2 关键选项详解
| 选项 | 适用场景 | 典型输出示例 |
|---|---|---|
| -a | 内存压力分析 | 显示active/inactive内存 |
| -d | 磁盘I/O瓶颈 | 读写请求合并统计 |
| -m | 内核内存泄漏 | slabtop的简化版 |
| -p | 分区级监控 | 指定分区的I/O统计 |
| -s | 长期趋势分析 | 内存/分页事件汇总 |
| -t | 时间戳标记 | 便于日志分析 |
-m选项的实战价值:曾用vmstat -m | grep -i dentry发现过dentry缓存泄漏导致的内存耗尽问题。
3. 输出字段全解析
3.1 标准模式字段
code复制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 124928 305004 132876 980124 0 0 12 24 101 156 12 4 82 2 0
-
procs(进程)
- r:可运行进程数(最直接的CPU负载指标)
- b:不可中断睡眠进程数(通常与I/O相关)
-
memory(内存)
- swpd:已用交换空间(警惕非零值)
- free:空闲物理内存(需结合cache看)
- buff/cache:缓冲/页缓存(Linux会主动利用空闲内存)
-
swap(交换)
- si/so:每秒交换入/出(任何非零值都需警惕)
-
I/O
- bi/bo:块设备读写(blocks/s)
-
CPU
- us:用户态CPU时间
- sy:内核态CPU时间
- id:空闲时间
- wa:I/O等待时间(超过20%需关注)
3.2 扩展模式示例
使用vmstat -d输出的磁盘统计:
code复制disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 120344 15232 3849216 75324 98211 85432 1563376 102344 0 12
关键字段:
- merged:合并的请求数(体现I/O调度效果)
- sectors:512字节为单位的传输量
- ms:毫秒级的I/O时间
4. 实战监控策略
4.1 基础监控命令
bash复制# 每2秒采样,共5次
vmstat 2 5
# 带时间戳的持续监控(适合日志记录)
vmstat -t 1
4.2 高级组合技巧
bash复制# 内存与slab监控组合
watch -n 2 'vmstat -a; echo; vmstat -m | head -n 10'
# 磁盘I/O与CPU关联分析
vmstat -d 1 10 > disk.log &
vmstat 1 10 > cpu.log
4.3 自动化监控脚本
bash复制#!/bin/bash
INTERVAL=5
COUNT=12
LOG_FILE=/var/log/vmstat_$(date +%Y%m%d).log
echo "===== $(date) =====" >> $LOG_FILE
vmstat -t $INTERVAL $COUNT >> $LOG_FILE
# 关键指标提取
grep -v memory $LOG_FILE | awk '{if($9 > 0 || $10 >0) print "WARNING: Swap detected!"}'
5. 性能问题诊断指南
5.1 CPU瓶颈特征
r值持续超过CPU核心数us+sy合计>80%cs(上下文切换)异常增高
案例:某Java应用us持续90%+,经查是未限制线程池大小导致。
5.2 内存不足表现
free接近0但cache较高(可能正常)si/so持续非零(绝对危险信号)wa升高伴随b进程增多
5.3 磁盘I/O问题
bi/bo持续高位wa>30%b列进程堆积
调优建议:结合-d选项确认具体磁盘,再使用iotop定位进程。
6. 常见误区解析
-
free内存少=内存不足?
- 错!Linux会主动用空闲内存作cache
- 正确判断:观察
si/so和wa
-
CPU idle高=性能好?
- 不一定,可能是I/O bound型负载
- 需结合
r和b队列判断
-
第一次输出的平均值无用?
- 其实能反映系统启动以来的负载特征
- 对比实时数据可发现异常模式
7. 专业运维建议
-
基准线建立:
bash复制# 业务低峰期采集基准数据 vmstat 10 6 > baseline.log -
报警阈值设置:
si/so> 0 立即报警wa> 25% 警告r> CPU核心数*2 预警
-
历史数据分析:
bash复制# 统计CPU使用率中位数 awk '{if($1~/^[0-9]/)print $13+$14}' vmstat.log | sort -n | awk '{arr[NR]=$1} END {print arr[int(NR*0.5)]}'
在实际运维中,我习惯将vmstat与sar、dstat等工具配合使用。对于容器化环境,需要注意直接在主节点运行vmstat反映的是宿主机的状态,要排查容器内部问题还需进入容器执行或使用cadvisor等专用工具。
