精通 Linux 系统资源监控:vmstat 命令详解

在 Linux 系统管理和性能调优中,实时了解系统的资源使用情况是至关重要的。无论是 CPU 繁忙、内存不足,还是 I/O 瓶颈,快速定位问题所在才能有效解决。在众多系统监控工具中,vmstat(Virtual Memory Statistics)是一个轻量级但功能强大的经典工具,它能够提供关于进程、内存、分页、块 I/O、陷阱(中断)和 CPU 活动等的全面报告。

本文将深入探讨 vmstat 命令,从基本概念到高级用法,并通过实例演示如何解读其输出,帮助您成为一名更高效的 Linux 系统管理员。

目录#

  1. vmstat 命令概述
  2. 安装 vmstat
  3. 命令语法与选项
  4. 解读 vmstat 输出
  5. 常用实践与示例
  6. 最佳实践与性能分析技巧
  7. 总结
  8. 参考

一、vmstat 命令概述#

vmstat 的全称是 Virtual Memory Statistics,即虚拟内存统计。它报告的是自系统启动以来的平均值(当只运行一次时)或间隔时间内的差值(当连续运行时)。这使得它特别适合用于观察系统资源的变化趋势,而不是一个绝对的瞬时值。

它的核心价值在于能够在一个统一的界面中展示多个关键性能指标,方便管理员进行关联分析。

二、安装 vmstat#

大多数主流 Linux 发行版都已经预装了 vmstat。它通常是 procpsprocps-ng 软件包的一部分。

如果您的系统提示 command not found,可以使用以下命令安装:

  • 对于 Debian/Ubuntu 系列:

    sudo apt-get update
    sudo apt-get install procps
  • 对于 RHEL/CentOS/Fedora 系列:

    # RHEL/CentOS
    sudo yum install procps-ng
    # 或者使用 dnf ( newer versions )
    sudo dnf install procps-ng

三、命令语法与选项#

vmstat 的基本语法如下:

vmstat [选项] [间隔时间] [次数]

常用选项:

  • -a:显示活跃和非活跃内存。
  • -f:显示自系统启动以来的 fork 数量。
  • -m:显示 slabinfo(内核片信息)。
  • -s:显示内存统计的详细表格,包含各种事件的数量。
  • -d:显示磁盘统计信息。
  • -p <分区>:显示指定磁盘分区的详细 I/O 统计。
  • -S <单位>:指定内存输出的单位(k, K, m, M 分别代表 1000, 1024, 1000000, 1048576 字节)。
  • -t:在输出中增加时间戳(非常有用,便于记录)。
  • -w:宽输出模式,在宽屏终端上提供更易读的格式(推荐使用)。

参数:

  • 间隔时间:两次输出之间的间隔秒数。
  • 次数:输出的总次数。如果不指定次数,则会一直输出。

四、解读 vmstat 输出#

理解 vmstat 的每一列是有效利用它的关键。我们以一个典型的输出为例:

$ vmstat -w 1
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       684368         2108      1456608    0    0    40    25   89  128   5   2  93   0   0
 0  0            0       684344         2108      1456612    0    0     0     0  945 1533   1   1  98   0   0

输出分为 6 个大类:

4.1 Procs(进程)#

  • r运行队列长度,即等待运行的进程数。这个值长期大于 CPU 核心数,则表示 CPU 资源紧张,进程存在等待。
  • b不可中断睡眠的进程数。这些进程通常正在等待 I/O 操作(如磁盘读写)。如果这个值长时间很高(>0),可能表示 I/O 存在瓶颈。

4.2 Memory(内存)#

  • swpd: 已使用的虚拟内存(swap)大小。
  • free: 空闲的物理内存大小。
  • buff: 用作缓冲区(buffer cache)的内存大小,用于缓存磁盘的读写数据。
  • cache: 用作缓存(page cache)的内存大小,用于缓存打开的文件。注意:Linux 会利用空闲内存做缓存,所以 free 内存少不一定代表内存不足,应结合 si/so 分析。

4.3 Swap(交换分区)#

  • siSwap In,从磁盘交换到内存的数据量(单位: KB/s)。如果这个值持续大于0,说明物理内存不足,系统正在频繁使用交换分区,性能会严重下降。
  • soSwap Out,从内存交换到磁盘的数据量(单位: KB/s)。意义同 si

4.4 IO(输入/输出)#

  • biBlocks In,从块设备接收的块数(单位: 块/秒),通常对应读磁盘操作。
  • boBlocks Out,发送到块设备的块数(单位: 块/秒),通常对应写磁盘操作。这两个值高表示磁盘正在繁忙。

4.5 System(系统)#

  • in中断次数,包括时钟中断。
  • cs上下文切换次数。如果 incs 值非常高,可能表示内核态开销过大,可能与过多的进程或中断处理有关。

4.6 CPU(处理器)#

CPU 时间占用百分比,总和不大于 100%。

  • us: 用户进程执行时间百分比。
  • sy: 系统内核执行时间百分比。如果 us + sy 长期超过 80%,说明 CPU 负载很高。
  • id: 空闲时间百分比。
  • waI/O 等待时间百分比。这是判断 I/O 瓶颈的关键指标。如果这个值持续很高(如 >20%),说明 CPU 大量时间在等待 I/O 操作完成,磁盘成为系统瓶颈。
  • st被偷取的时间百分比,仅出现在虚拟化环境中。表示当前虚拟机被宿主机“偷走”的 CPU 时间。如果这个值高,说明宿主机资源紧张。

五、常用实践与示例#

5.1 查看一次性快照#

直接运行 vmstat,显示自系统启动以来的平均值。

vmstat -w

5.2 连续监控(最常用)#

每 2 秒刷新一次统计信息,持续监控系统动态。

vmstat -w 2

这是诊断间歇性性能问题的最佳方式。

5.3 带时间戳的监控#

在每行输出前加上时间戳,便于后续分析和记录。

vmstat -wt 2

输出示例:

2024-05-16 10:30:01 UTC procs ...
2024-05-16 10:30:03 UTC    1  0 ...

5.4 监控特定次数后退出#

每 1 秒刷新一次,总共刷新 5 次后自动退出。

vmstat -w 1 5

5.5 以MB为单位显示#

让内存相关的列以 MB 为单位显示,更易读。

vmstat -w -S m 1

六、最佳实践与性能分析技巧#

  1. 关注趋势,而非单点数据vmstat 的强大之处在于连续监控。观察各项指标随时间的变化趋势,比看一个瞬间值更有意义。
  2. 关联分析指标
    • CPU 瓶颈:观察 r 列和 us/sy 列。如果 r 值持续大于 CPU 核心数,且 us/sy 很高,则是 CPU 瓶颈。
    • 内存瓶颈:观察 free 内存是否持续很低,同时 siso 是否长期大于 0。这是内存不足的明确信号。
    • I/O 瓶颈:这是 vmstat 最擅长诊断的。关键指标是 wa(CPU I/O 等待)。如果 wa 高,同时 b 列(阻塞进程)也高,并且 bi/bo 磁盘读写量很大,基本可以断定是磁盘 I/O 瓶颈。
  3. 结合其他工具vmstat 提供了宏观视角。当发现异常时,应使用更专业的工具深入调查。例如:
    • CPU 问题:使用 toppidstat 查看具体进程。
    • I/O 问题:使用 iostatiotop 查看具体是哪个磁盘或进程导致的。
    • 内存问题:使用 slabtop(配合 vmstat -m)或 pmap
  4. 建立性能基线:在系统正常运行时,记录下 vmstat 的典型输出。这样当出现性能问题时,可以快速与基线对比,发现异常点。

七、总结#

vmstat 是一个不可或缺的 Linux 系统性能监控工具。它以其简洁、高效和全面的特点,成为系统管理员工具箱中的一把瑞士军刀。通过熟练掌握其输出含义,并遵循关联分析和趋势观察的最佳实践,您将能够快速诊断出系统中大多数常见的资源瓶颈(CPU、内存、I/O),为后续的深入分析和性能优化打下坚实的基础。

八、参考#