在系统性能调优与故障排查过程中,磁盘I/O 往往成为主要的性能瓶颈。本文将从实战角度深度解析 iostat 这一经典工具——它可以精准监控设备的负载状况。首次运行时,iostat 会显示系统启动以来的累计统计信息;后续每次运行则展示自上次执行后的变化数据。通过指定采样次数与时间间隔,你可以轻松获取所需的磁盘性能指标。
语法格式
标准调用命令如下,选项与参数含义清晰直观:
iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]
基础用法
先运行一个最常见的示例,观察输出效果:
iostat -d -k 1 10Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 39.29 21.14 1.44 441339807 29990031sda1 0.00 0.00 0.00 1623 523sda2 1.32 1.43 4.54 29834273 94827104sda3 6.30 0.85 24.95 17816289 520725244sda5 0.85 0.46 3.40 9543503 70970116sda6 0.00 0.00 0.00 550 236sda7 0.00 0.00 0.00 406 0sda8 0.00 0.00 0.00 406 0sda9 0.00 0.00 0.00 406 0sda10 60.68 18.35 71.43 383002263 1490928140 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 327.55 5159.18 102.04 5056 100sda1 0.00 0.00 0.00 0 0
参数 -d 表示显示磁盘使用状态;-k 强制以 Kilobytes 为单位输出;最后的 1 10 表示每 1 秒刷新一次数据,总共输出 10 次。输出中各列的含义解释如下:
tps:每秒的传输次数(Indicate the number of transfers per second that were issued to the device)。一次“传输”即代表一次 I/O 请求。多个逻辑请求可能被合并为一次物理 I/O 请求,请求的大小未知。
kB_read/s:每秒从设备读取的数据量;
kB_wrtn/s:每秒向设备写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数据量;以上单位均为 Kilobytes。
在上面的示例中,磁盘 sda 的总 TPS 为 39.29,下方展示了各个分区的 TPS。由于输出的是瞬间值,因此总 TPS 并不严格等于各分区 TPS 之和。
如果你希望只监控某个特定设备(例如 sda),可以使用如下命令:
iostat -d sda 2
-x 参数详解
iostat 的 -x 选项非常实用,用于显示扩展的 I/O 数据:
iostat -d -x -k 1 10Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s a vgrq-sz a vgqu-sz await svctm %utilsda 1.56 28.31 7.80 31.49 42.51 2.92 21.26 1.46 1.16 0.03 0.79 2.62 10.28Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s a vgrq-sz a vgqu-sz await svctm %utilsda 2.00 20.00 381.00 7.00 12320.00 216.00 6160.00 108.00 32.31 1.75 4.50 2.17 84.20
这些扩展字段的含义如下:
rrqm/s:每秒该设备相关的读取请求被合并的次数(当 VFS 将请求发送给文件系统时,若发现多个读取请求指向相同的 Block,文件系统会合并这些请求)。
wrqm/s:每秒写入请求被合并的次数。
rsec/s:每秒读取的扇区数。
wsec/s:每秒写入的扇区数。
rKB/s:每秒发出的读请求数量。
wKB/s:每秒发出的写请求数量。
avgrq-sz:平均每次请求的扇区大小。
avgqu-sz:平均请求队列的长度。队列越短,说明 I/O 处理效率越高。
await:每个 I/O 请求处理的平均时间(单位毫秒),可以理解为 I/O 响应时间。通常系统 I/O 响应时间应低于 5ms,若超过 10ms 则表明延迟较大。该时间包含队列等待时间与服务时间,因此
await通常大于svctm;差值越小说明队列时间越短,反之则队列时间越长,系统可能存在性能问题。svctm:平均每次设备 I/O 操作的服务时间(毫秒)。若
svctm与await非常接近,说明几乎没有 I/O 等待,磁盘性能良好;若await远高于svctm,则表示 I/O 队列等待时间过长,应用程序响应会变慢。%util:在统计时间内,设备忙于处理 I/O 的时间占比。例如,间隔 1 秒内设备有 0.8 秒在处理 I/O,0.2 秒空闲,则 %util = 80%。该参数直观反映设备的繁忙程度。一般来说,若达到 100%,意味着设备接近满负荷运行(但在多磁盘场景下,即使 %util 达到 100%,由于并发能力,磁盘未必是瓶颈)。
-c 参数使用
iostat 同样可以查看 CPU 状态:
iostat -c 1 10
输出示例:
a vg-cpu: %user %nice %sys %iowait %idle 1.98 0.00 0.35 11.45 86.22 a vg-cpu: %user %nice %sys %iowait %idle 1.62 0.00 0.25 34.46 63.67
常见命令组合
以下整理了日常工作中最常用的几条 iostat 命令:
iostat -d -k 1 10 # 查看 TPS 和吞吐量(磁盘读写速度单位为 KB)
iostat -d -m 2 # 查看 TPS 和吞吐量(单位为 MB)
iostat -d -x -k 1 10 # 查看设备使用率(%util)、响应时间(await)
iostat -c 1 10 # 查看 CPU 状态
实例分析
来看一段实际输出,重点关注 sda10:
iostat -d -k 1 |grep sda10Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda10 60.72 18.95 71.53 395637647 1493241908sda10 299.02 4266.67 129.41 4352 132sda10 483.84 4589.90 4117.17 4544 4076sda10 218.00 3360.00 100.00 3360 100sda10 546.00 8784.00 124.00 8784 124sda10 827.00 13232.00 136.00 13232 136
从以上数据可以看出,磁盘每秒传输次数平均约 400;每秒读取数据约 5MB,写入约 1MB。
再结合 -x 参数查看详细指标:
iostat -d -x -k 1Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s a vgrq-sz a vgqu-sz await svctm %utilsda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24
观察发现,磁盘的平均响应时间(await)小于 5ms,但磁盘使用率(%util)已超过 80%。这表示磁盘响应速度尚在正常范围内,但负载已经相当繁忙,需要密切监控是否接近容量上限。
