83·系统监控与调优进阶

vmstat 与 iostat 性能监控

vmstatiostat

第 83 课 - vmstat 与 iostat 性能监控

所属模块:系统监控与调优 难度:Intermediate 标签vmstat, iostat, 性能监控, 系统调优

1. 学习目标

通过本课的学习,你将能够:

  • 掌握 vmstat 命令的基本用法,实时监控系统的 CPU、内存、进程和磁盘活动。
  • 理解 vmstat 输出中关键指标(如 r, b, swpd, si, so, us, sy, wa)的含义。
  • 掌握 iostat 命令的基本用法,专注于监控磁盘 I/O 的详细统计信息。
  • 能够结合 vmstatiostat 的输出,对系统的性能瓶颈(CPU、内存、磁盘 I/O)进行初步诊断。

2. 核心概念

当你的系统变慢或服务响应延迟时,第一步往往是找到瓶颈在哪里:是CPU忙不过来?内存不够用了?还是磁盘读写太慢?vmstatiostat 就是两款经典的、轻量级的诊断工具。

  • vmstat (Virtual Memory Statistics): 名字虽然带“虚拟内存”,但它是一个全能型选手。它报告关于内核线程、虚拟内存、磁盘、陷阱和CPU活动的信息。你可以把它看作一个系统的快速体检仪,一眼扫过去就能知道几个关键指标是否正常。
  • iostat (I/O Statistics): 这是一位磁盘专科医生。它专注于报告磁盘I/O的详细统计数据,能告诉你每个磁盘设备有多忙、读写速度如何、请求在队列里等了多久。当 vmstatwa (I/O等待) 指标偏高时,就需要请出 iostat 来做深入检查了。

简单来说,先用 vmstat 宏观看是哪个部分(CPU/内存/IO)出了问题,再用 iostat 等工具针对问题部分进行微观分析。

3. 代码示例

3.1 使用 vmstat 监控系统

# 基本用法:每2秒刷新一次,共刷新10次
vmstat 2 10

# 输出示例(基于CentOS 7,输出会因系统不同略有差异):
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 354088   2080 268368    0    0    10     5   55   98  3  1 96  0  0
 0  0      0 354072   2080 268368    0    0     0     0  105  196  1  1 98  0  0
# ... (后续行每2秒刷新一次)

关键列解读:

  • procs: r (运行队列中的进程数),b (等待I/O的进程数)。r 长期大于CPU核心数说明CPU瓶颈,b 大于0说明可能有磁盘瓶颈。
  • memory: swpd (使用的虚拟内存),free (空闲内存),buff (用作缓冲的内存),cache (用作缓存的内存)。关注 swpd 是否持续增长(可能内存不足,开始用交换分区)。
  • swap: si (从磁盘换入的内存,单位KB/s),so (换出到磁盘的内存)。如果这两个值持续不为0,说明物理内存严重不足,系统在频繁进行内存交换,这会极大影响性能。
  • io: bi (块设备读入,单位Blocks/s),bo (块设备写出)。
  • system: in (每秒中断数),cs (每秒上下文切换数)。大量的上下文切换可能消耗CPU资源。
  • cpu: us (用户CPU时间),sy (系统CPU时间),id (空闲CPU时间),wa (等待I/O的CPU时间)。重点wa 长期高于5-10%时,说明系统可能因磁盘I/O慢而阻塞。

3.2 使用 iostat 监控磁盘I/O

# 基本用法:仅查看磁盘统计,每2秒刷新一次,共5次,显示易读的KB/MB单位
iostat -dxk 2 5

# 输出示例(假设有一个磁盘 sda):
Linux 3.10.0-1160.el7.x86_64 (yourhost) 	07/25/2024 	_x86_64_	(2 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.05     1.20    1.10    2.35    44.12    45.20    52.15     0.01    3.15    1.25    4.05   0.45   0.16

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
# ...

关键列解读 (重点关注 Device 为你的磁盘名,如 sda, vda, nvme0n1):

  • r/s, w/s: 每秒的读/写请求数。
  • rkB/s, wkB/s: 每秒读/写的千字节数。
  • await: 每个I/O请求的平均等待时间(毫秒)。这是最重要的指标之一。通常认为,对于机械硬盘(HDD),await 超过10-15ms就要关注;对于固态硬盘(SSD),应保持在1-2ms以内。时间越长,说明磁盘响应越慢。
  • avgqu-sz: 平均I/O队列长度。队列越长,说明堆积的请求越多,磁盘压力大。
  • %util: 磁盘利用率。接近100%意味着磁盘已饱和。这是衡量磁盘忙碌程度的关键指标。注意,对于现代的高速SSD,%util 可能很快达到100%,但此时 awaitavgqu-sz 可能并不高,性能依然良好。需要结合 await 综合判断。

4. 实践练习

练习1:基础监控

  1. 在你的Linux系统上,打开一个终端。
  2. 执行命令 vmstat 1,并保持运行。
  3. 在另一个终端中,执行一个消耗资源的命令,例如 find / -name “*.log” > /dev/null 2>&1 &
  4. 观察第一个终端中 vmstat 的输出,哪些指标(r, b, us, wa)发生了明显变化?

练习2:深入磁盘分析 假设你发现系统的 %util 磁盘利用率很高,但不确定是读多还是写多。

  1. 使用 iostat -dxk 1 命令持续监控。
  2. 观察 r/sw/s 以及 rkB/swkB/s,判断当前主要的I/O活动是读还是写?

练习3:综合诊断 场景:一个Web应用响应变慢。

  1. 运行 vmstat 2 5,查看 wa 列是否显著大于0。
  2. 如果 wa 很高,运行 iostat -dxk 1 3,查看具体是哪个磁盘的 %util 高、await 高。
  3. 尝试描述你初步诊断出的问题(例如:“系统在等待磁盘I/O,主要瓶颈磁盘是 /dev/sda,其利用率高且响应延迟大”)。

5. 常见错误

  1. 误解输出列的含义: 尤其是 vmstatsi/so(换入/换出)和 iostat%utilsi/so 不为0是内存问题的强烈信号;%util 100%不一定代表磁盘已是瓶颈,需结合 await 看。
  2. 只看瞬时值,不关注趋势: 运行一次 vmstat 1,看到 r=0, b=0, id=99 就认为系统没问题。应该运行多次或一段时间(如 vmstat 1 10),观察指标是否稳定。
  3. 忽略单位和换算vmstatbi/bo 单位是“块/秒”(block/s),iostatrkB/s/wkB/s 是“千字节/秒”。不要混淆。要换算成MB/s的话,通常将KB/s除以1024。
  4. 过度依赖单一工具vmstatiostat 提供的是全局概览。对于复杂的性能问题,还需要结合 top(查看具体进程)、pidstat(查看进程级I/O)、strace(跟踪系统调用)等工具进行深入分析。

6. 小结

  • vmstat 是系统性能的总览图,用于快速识别瓶颈领域(CPU、内存、I/O)。重点关注 r/b(进程状态)、si/so(内存交换)、us/sy/wa(CPU时间分配)。
  • iostat 是磁盘I/O的详细报告,用于量化磁盘性能。重点关注 %util(利用率)、await(响应延迟)、r/s & w/s(IOPS)和 rkB/s & wkB/s(吞吐量)。
  • 诊断流程: 先用 vmstat 判断系统整体健康状况,若怀疑磁盘I/O是瓶颈,再用 iostat 对特定磁盘进行深入剖析。
  • 这两个工具通常是性能排查的第一步,输出结果能帮助你决定下一步需要使用何种更专业的工具进行深入调查。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「sar 系统活动报告」 以巩固所学知识。