vmstat 虚拟内存监控工具在开发中的运用
vmstat (Virtual Memory Statistics) 是一个强大的系统监控工具,能够提供关于系统虚拟内存、进程、CPU活动等方面的信息。在开发过程中,vmstat 可以帮助排查多种性能问题。
vmstat 能排查的问题
-
内存瓶颈问题
- 检测内存不足导致的频繁交换(Swap)
- 发现内存泄漏问题
- 监控空闲内存变化趋势
-
CPU性能问题
- 识别CPU使用率过高情况
- 发现CPU资源争用
- 监控系统进程和用户进程的CPU使用比例
-
I/O性能问题
- 检测磁盘I/O瓶颈
- 发现过多的等待I/O的进程
- 监控块设备读写情况
-
系统负载问题
- 识别系统过载情况
- 监控运行队列长度
vmstat 基本用法
bash
vmstat [选项] [时间间隔] [次数]
常用选项:
-a
:显示活跃和非活跃内存-m
:显示slabinfo-s
:显示内存统计信息-d
:显示磁盘统计信息-p
:显示指定磁盘分区的统计信息
实际应用示例
-
基本监控(每2秒刷新一次,共5次) vmstat 2 5
-
监控系统内存使用情况 vmstat -a 1 5
-
监控磁盘I/O vmstat -d 1 3
-
持续监控系统状态 vmstat 1
输出字段解析
css
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
-
procs
r
: 运行队列中的进程数b
: 等待I/O的进程数
-
memory
swpd
: 使用的虚拟内存量free
: 空闲内存量buff
: 用作缓冲区的内存量cache
: 用作缓存的内存量
-
swap
si
: 从磁盘交换到内存的量so
: 从内存交换到磁盘的量
-
io
bi
: 从块设备接收的块数bo
: 发送到块设备的块数
-
system
in
: 每秒中断数cs
: 每秒上下文切换数
-
cpu
us
: 用户空间占用CPU百分比sy
: 内核空间占用CPU百分比id
: 空闲CPU百分比wa
: 等待I/O的CPU百分比st
: 虚拟机偷取时间百分比
开发中的实际应用场景
-
识别内存泄漏
- 观察
free
内存持续减少 swpd
不断增加而si/so
有活动
- 观察
-
检测CPU瓶颈
us
长期高于70%可能应用需要优化sy
过高可能系统调用过多
-
发现I/O问题
wa
值高表示I/O等待严重bi/bo
值高表示磁盘读写频繁
-
系统负载分析
r
值长期大于CPU核心数表示系统过载
高级技巧
-
结合其他工具使用: vmstat 1 | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}'
-
监控特定进程的内存使用: vmstat -p /dev/sda1 1 5
-
长期监控并记录到文件: vmstat 30 > vmstat.log &
开发中实战分析
vmstat 1

关键指标分析
-
CPU 使用情况 (cpu列)
-
us
(用户态):3-5% (正常) -
sy
(内核态):1-9% (正常) -
id
(空闲):21-48% (逐渐降低) -
wa
(I/O等待):39-71% (严重问题)- 超过 20% 即表示 I/O 瓶颈,此处持续高达 50% 以上,说明磁盘是系统瓶颈。
-
st
(虚拟机偷取时间):0% (无影响)
-
-
进程队列 (procs列)
-
r
(运行队列):0-4 (正常) -
b
(阻塞进程):5-13 (持续高位)- 大量进程因等待 I/O 被阻塞。
-
-
内存/交换 (memory/swap列)
free
(空闲内存):615MB-785MB (充足)swpd
(交换分区使用量):0 (未使用交换空间,内存充足)buff/cache
:合理利用缓存,无异常。
-
I/O 统计 (io列)
-
bo
(块设备写入):高达 98352 (第一行),后续波动- 存在大量磁盘写入操作。
-
bi
(块设备读取):基本为0 (读取压力小)。 -
si/so
(交换入/出):0 (无交换活动)。
-
-
系统中断 (system列)
in
(中断次数):约 11k-13k/秒 (正常)cs
(上下文切换):约 17k-18k/秒 (正常)
问题诊断结论
-
主要瓶颈 :磁盘 I/O 性能不足
-
高
wa
(I/O 等待) 和持续阻塞进程 (b
) 表明磁盘写入速度跟不上请求。 -
可能原因:
- 磁盘硬件性能差(如机械硬盘)。
- 大量小文件写入(未合并 I/O)。
- RAID/磁盘阵列配置不当。
- 应用程序频繁同步写入(如日志、数据库事务)。
-
-
次要观察:
- CPU 资源充足(
id
空闲率高),但受限于 I/O,无法有效利用。 - 内存充足,无交换压力。
- CPU 资源充足(
建议的优化措施
- 立即检查磁盘负载
bash
iostat -x 1 # 查看 %util 和 await 确认磁盘利用率

markdown
- 如果 `%util` 接近 100%,说明磁盘饱和。
-
针对性优化
-
硬件层:
- 替换为 SSD/NVMe 磁盘。
- 增加磁盘阵列的条带化(RAID 0/10)。
-
系统层:
- 调整 I/O 调度器(如改为
deadline
或noop
):
- 调整 I/O 调度器(如改为
-
bash
echo deadline > /sys/block/sdX/queue/scheduler
- 增加文件系统写入缓存(风险:可能丢数据):
-
-
bash
echo 50 > /proc/sys/vm/dirty_ratio
-
应用层:
- 减少同步写入(如数据库的
fsync
频率)。 - 合并小文件写入(批量操作)。
- 减少同步写入(如数据库的
-
-
长期监控
- 使用
dstat
或sar
记录历史数据,分析高峰期的 I/O 模式。
- 使用
补充命令建议

-
查看具体进程的 I/O 使用:
bash
iotop -o # 显示正在执行 I/O 的进程
- 检查磁盘健康状态(如果是机械硬盘):
bash
smartctl -a /dev/sdX