Linux命令-vmstat(虚拟内存统计 —— 系统性能诊断核心工具) 📅 发布时间:2026/8/22 6:43:39 👁 浏览次数: Linux命令-vmstat虚拟内存统计 —— 系统性能诊断核心工具 简介安装位置 语法⚙️ 选项 示例示例 1基本用法 —— 连续采样示例 2逐字段解读 —— 性能调优实战示例 3内存统计汇总示例 4磁盘 I/O 统计示例 5显示活跃/非活跃内存示例 6完整性能诊断报告示例 7编写性能监控脚本⚠️ 注意vmstat vs iostat vs mpstat 对比常见性能问题诊断流程 总结 相关命令快速参考vmstatVirtual Memory Statistics是 Linux 系统中最重要的性能监控工具之一。它以简洁的表格形式周期性地报告进程状态、内存使用、交换分区活动、I/O 操作、系统中断、CPU 使用率六大维度的实时数据。不需要安装额外的软件包vmstat属于procps-ng包几乎所有 Linux 发行版默认安装。 简介vmstat诞生于 UNIX 早期如今是 Linux 性能诊断的第一把手术刀。当系统出现卡顿、响应缓慢时vmstat能快速帮助判断瓶颈所在是 CPU 饱和内存不足导致交换还是磁盘 I/O 拖累它的数据来源于/proc/虚拟文件系统/proc/meminfo、/proc/stat、/proc/vmstat等因此开销极低适合在生产环境中长期运行。安装位置# vmstat 命令路径whichvmstat# 输出/usr/bin/vmstat# 查看所属软件包rpm-qf/usr/bin/vmstat# 输出procps-ng-3.3.10-28.el7.x86_64dpkg-S/usr/bin/vmstat# 输出procps: /usr/bin/vmstat# 查看版本vmstat-V# 输出vmstat from procps-ng 3.3.10 语法vmstat [选项] [间隔秒数 [次数]]参数说明间隔秒数每次采样的时间间隔次数总共采样的次数省略则无限循环直到 CtrlC不指定参数时vmstat输出自系统启动以来的平均值单次快照。⚙️ 选项选项说明-a, --active显示活跃/非活跃内存active/inactive-f, --forks显示自启动以来的 fork 次数-m, --slabs显示 slab 缓存信息-n, --one-header仅显示一次表头默认间隔采样时会重复打印表头-s, --stats显示各类事件计数器内存、CPU、I/O 等统计汇总-d, --disk显示磁盘 I/O 统计-p, --partition 设备显示指定磁盘分区的详细 I/O 统计-S, --unit 单位指定内存单位k (1000), K (1024), m (1,000,000), M (1,048,576)-t, --timestamp在每行输出前添加时间戳-w, --wide宽输出模式避免字段拥挤 示例示例 1基本用法 —— 连续采样# 每秒采样一次共 5 次vmstat15# 输出# 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 0 3456789 234567 4567890 0 0 5 10 50 100 5 2 92 1 0# 0 0 0 3456780 234567 4567892 0 0 0 20 120 200 8 3 87 2 0# 1 0 0 3456770 234567 4567895 0 0 0 15 100 180 6 2 91 1 0# 0 0 0 3456765 234567 4567900 0 0 0 10 110 190 7 2 90 1 0# 3 0 0 3456760 234568 4567905 0 0 10 30 130 210 10 4 84 2 0# 不指定次数持续采样CtrlC 退出vmstat2# 输出每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 3456789 234567 4567890 0 0 5 10 50 100 5 2 92 1 0# 2 0 0 3456770 234567 4567895 0 0 0 15 100 180 6 2 91 1 0# ^C示例 2逐字段解读 —— 性能调优实战# 详细解读每个字段的含义和告警阈值# procs进程 # r等待运行的进程数包括正在CPU上运行和等待CPU的# ⚠️ 若 r CPU 逻辑核数 → CPU 饱和需要优化或扩容# b不可中断睡眠的进程数通常是在等待I/O# ⚠️ 若 b 持续 0 → 存在 I/O 瓶颈# memory内存单位 KB # swpd已使用的虚拟内存交换分区# ⚠️ 若持续增长 → 内存不足系统在频繁使用交换# free完全空闲的物理内存# buff缓冲区用于块设备的元数据缓存# cache页面缓存用于文件系统缓存# ✅ 实际上 buffcache 可用内存的一部分# swap交换分区活动 # si (swap in)从磁盘换入内存的速率KB/s# so (swap out)从内存换出到磁盘的速率KB/s# ⚠️ 若 si 和 so 持续 0 → 内存严重不足# 系统正在颠簸(thrashing)性能急剧下降# io输入/输出 # bi (block in)从块设备读取的速率blocks/s# bo (block out)写入块设备的速率blocks/s# 注意block 大小通常为 1KB# system系统 # in每秒中断数包括时钟中断# cs (context switch)每秒上下文切换次数# ⚠️ cs 10000 且持续增长 → 进程/线程切换过于频繁# 可能是多线程争用或进程数过多# cpuCPU 使用率总计 100% # us (user)用户态进程占用 CPU 时间百分比# sy (system)内核态占用 CPU 时间百分比# ⚠️ sy 持续 30% → 内核开销过大系统调用或中断过多# id (idle)CPU 空闲时间百分比# wa (wait)CPU 等待 I/O 完成的时间百分比# ⚠️ wa 30% → I/O 是主要瓶颈CPU 在等待磁盘# st (stolen)虚拟化环境中被宿主机偷走的 CPU 时间# ⚠️ st 10% → 宿主机 CPU 过载考虑迁移虚拟机示例 3内存统计汇总# 使用 -s 查看事件计数器汇总vmstat-s# 输出# 16384000 K total memory# 12345678 K used memory# 3045678 K active memory# 2012345 K inactive memory# 4038322 K free memory# 234567 K buffer memory# 3456789 K swap cache# 8388608 K total swap# 0 K used swap# 8388608 K free swap# 123456 non-nice user cpu ticks# 2345 nice user cpu ticks# 56789 system cpu ticks# 1234567 idle cpu ticks# 12345 IO-wait cpu ticks# 234 IRQ cpu ticks# 567 softirq cpu ticks# 0 stolen cpu ticks# 1234567 pages paged in# 2345678 pages paged out# 12345 pages swapped in# 0 pages swapped out# 1234567 interrupts# 2345678 CPU context switches# 1687880023 boot time# 12345 forks# 重点关注的指标# - used swap 0有内存被换出性能预警# - pages swapped in/out 0交换活动发生# - IO-wait cpu ticks 占比较高I/O 瓶颈示例 4磁盘 I/O 统计# 查看所有磁盘的 I/O 统计vmstat-d# 输出# disk- ------------reads------------ ------------writes----------- -----IO------# total merged sectors ms total merged sectors ms cur sec# sda 1234 567 123456 12345 5678 890 234567 23456 0 12# sdb 456 78 45678 4567 890 123 89123 8912 0 5# sr0 0 0 0 0 0 0 0 0 0 0# 查看指定分区的详细统计vmstat-p/dev/sda1# 输出# sda1 reads read sectors writes requested writes# 1234 123456 5678 234567示例 5显示活跃/非活跃内存# 使用 -a 显示活跃内存信息vmstat-a13# 输出# 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 0 3456789 2345678 5678901 0 0 5 10 50 100 5 2 92 1 0# 0 0 0 3456780 2345675 5678905 0 0 0 20 120 200 8 3 87 2 0# 2 0 0 3456770 2345670 5678908 0 0 0 15 100 180 6 2 91 1 0# 关键字段解读# inact不活跃内存最近未访问优先被回收# active活跃内存最近被访问过尽量保留# ✅ 当 free 内存不足时内核首先回收 inact 页面示例 6完整性能诊断报告# 每秒采样一次共 10 次带时间戳vmstat-t110# 输出# procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----# r b swpd free buff cache si so bi bo in cs us sy id wa st CST# 2 0 0 3456789 234567 4567890 0 0 5 10 50 100 5 2 92 1 0 2026-06-14 14:30:01# 0 0 0 3456780 234567 4567892 0 0 0 20 120 200 8 3 87 2 0 2026-06-14 14:30:02# ...# 宽输出模式适用于高配置服务器数值可能很大vmstat-w15# 输出列对齐更好# 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 0 3456789 234567 4567890 0 0 5 10 50 100 5 2 92 1 0示例 7编写性能监控脚本# 创建一个简单的性能监控脚本cat/tmp/monitor.shSCRIPT #!/bin/bash # 每5秒采样一次连续监控30次共2.5分钟 # 检测CPU、内存、I/O 异常并告警 CPU_CORES$(nproc) ALERT_LOG/tmp/vmstat_alert.log vmstat 5 30 | tail -n 3 | while read r b swpd free buff cache si so bi bo in cs us sy id wa st; do # CPU 等待进程数超过核心数 if [ $r -gt $CPU_CORES ]; then echo [$(date)] ⚠️ CPU 饱和等待队列 $r 核心数 $CPU_CORES $ALERT_LOG fi # 交换活动警告 if [ $si ! 0 ] || [ $so ! 0 ]; then echo [$(date)] ⚠️ 交换活动si$si so$so KB/s $ALERT_LOG fi # I/O 等待警告 if [ $wa -gt 30 ]; then echo [$(date)] ⚠️ I/O 等待$wa% $ALERT_LOG fi # 上下文切换频繁 if [ $cs -gt 50000 ]; then echo [$(date)] ⚠️ 上下文切换频繁$cs/s $ALERT_LOG fi done echo 监控完成告警记录见$ALERT_LOG cat $ALERT_LOG SCRIPTchmodx /tmp/monitor.sh# 执行监控/tmp/monitor.sh# 输出示例# 监控完成告警记录见/tmp/vmstat_alert.log# [Sun Jun 14 14:30:05 CST 2026] ⚠️ CPU 饱和等待队列 8 核心数 4# [Sun Jun 14 14:30:35 CST 2026] ⚠️ I/O 等待35%⚠️ 注意vmstat vs iostat vs mpstat 对比# vmstat 综合视图# 适用快速整体诊断一站式查看 CPU/内存/IO/进程vmstat15# 优势覆盖面广开销低# 劣势磁盘统计不够精细# iostat 磁盘专项# 适用深度分析磁盘 I/O 性能iostat-x15# 输出包含await平均等待时间、svctm服务时间、%util使用率# 优势磁盘指标细致# 劣势不涵盖内存和进程# mpstat CPU 专项# 适用逐核查看 CPU 使用情况mpstat-PALL15# 输出每个 CPU 核心的 us/sy/id/wa# 优势发现单核瓶颈# 劣势不涵盖内存和 I/O# 实战场景选择# 卡顿但不确定原因 → vmstat宽泛诊断# 磁盘响应慢 → iostat# CPU 使用率不均 → mpstat# 怀疑内存不足 → free vmstat常见性能问题诊断流程# 诊断流程图基于 vmstat 输出## 1. 先看 CPU# r CPU核心数 → CPU 瓶颈# us 高 → 应用程序计算密集# sy 高 → 系统调用/中断过多# wa 高 → I/O 瓶颈# st 高 → 虚拟化宿主机过载## 2. 再看内存# swpd 0 且持续增长 → 内存不足# si/so 0 → 正在 swap内存严重不足# free 接近 0 但 cache 很大 → 正常Linux 会积极缓存## 3. 然后看 I/O# bi/bo 高 → 磁盘读写频繁# b 列 0 → 有进程在等待 I/O## 4. 最后看系统# cs 异常高 → 上下文切换频繁可能是多线程争用# in 异常高 → 中断过多可能是网卡或磁盘中断# 实际诊断示例echo 快速诊断 echo--- CPU ---vmstat11|tail-1|awk{print 运行队列:$1 用户态:$13% 内核态:$14% IO等待:$16%}echo--- 内存 ---vmstat11|tail-1|awk{print 交换区:$3KB 空闲:$4KB 缓存:$6KB}echo--- 交换 ---vmstat11|tail-1|awk{print 换入:$7 换出:$8}echo--- I/O ---vmstat11|tail-1|awk{print 读:$9 写:$10} 总结vmstat是 Linux 性能诊断的第一工具六大维度进程、内存、交换、I/O、系统、CPU —— 一张表看遍系统全貌关键告警阈值r CPU 核心数CPU 饱和、si/so 0内存不足、wa 30%I/O 瓶颈、cs 50000上下文切换过频采样策略vmstat 间隔 次数—— 间隔不宜太短至少 1 秒次数足够才能观察趋势配套工具iostat做磁盘深度分析、mpstat做逐核 CPU 分析、free做内存快照数据来源/proc/虚拟文件系统开销极低生产环境长期运行无压力 相关命令命令说明iostat磁盘 I/O 专项统计更详细的磁盘指标mpstat逐 CPU 核心使用率统计free内存使用情况快照top/htop实时进程级资源监控sar系统活动记录与历史回放pidstat按进程统计资源使用情况dstat多功能系统资源统计vmstat iostat netstat 合体slabtop内核 slab 缓存实时监控