我们在 Linux 服务器排查问题时,一般会通过 top、vmstat、free、netstat、df -h 等命令排查 CPU、内存、网络和磁盘等问题。有的时候我们需要更进一步了解磁盘 I/O 的使用情况。本文介绍常用 I/O 性能分析命令和性能诊断方法。
I/O 性能分析命令
iostat
iostat 是 Linux 最常见的磁盘 I/O 监控工具。
- 基本用法
$iostat -d -x -k 1 10 |
-d 表示:显示设备(磁盘)使用状态。
-k 表示:某些使用 block 为单位的列强制使用 Kilobytes 为单位。
1 10 表示:数据显示每隔 1 秒刷新一次,共显示 10 次。
-x 参数:我们可以获得更多统计信息。

- 参数含义
rrqm/s:每秒进行 merge(多个 io 的合并)读操作的数量。
wrqm/s:每秒进行 merge(多个 io 的合并)写操作的数量。
rsec/s:每秒读取的扇区数。
wsec/s:每秒写入的扇区数。
rKB/s:每秒读多少k字节,在 kernel 2.4 以上,rkB/s=2×rsec/s,因为一个扇区为 512 bytes。
wKB/s:每秒写多少k字节,在 kernel 2.4 以上,wkB/s=2×wsec/s,因为一个扇区为 512 bytes。
avgrq-sz:平均请求扇区的大小。
avgqu-sz:是平均请求队列的长度。毫无疑问,队列长度越短越好。
await:每一个 IO 请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为 IO 的响应时间,一般地系统 IO 响应时间应该低于 5 ms,如果大于 10 ms 就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await 大于 svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm:表示平均每次设备 I/O 操作的服务时间(以毫秒为单位)。如果 svctm 的值与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好,如果 await 的值远高于 svctm 的值,则表示 I/O 队列等待太长,系统上运行的应用程序将变慢。
%util:在统计时间内所有处理 IO 时间,除以总共统计时间,该参数暗示了设备的繁忙程度,如果该参数是 100% 表示设备已经接近满负荷运行了(当然如果是多磁盘,即使 %util 是 100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
iotop
iotop 是一个用 python 编写的类似 top 界面的磁盘 I/O 监控工具。
- 基本用法
iotop |

- 参数含义
DISK READ 和 DISK WRITE 字段:代表块设备在采样时间内的 I/O 带宽。
SWAPIN 和 IO 字段:表示当前进程或线程花费在页面换入和等待 I/O 的时间。
PRIO 字段:表示 I/O 优先级。
Total DISK READ 和 Total DISK WRITE 字段:表示总的 I/O 读写情况。
- 常用参数
\-o --only 只显示实际具有I/O操作的进程或线程。可以通过快捷键o进行控制 |
I/O 性能诊断
用 vmstat 命令了解系统状况
[root@dm8 ~]# vmstat 1 10 |
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- |
如果 b 的值为 2~3 倍 CPU 数量,bi 和 bo 的值很大(有时 bi 和 bo 值很小,但 in 和 cs 很大,也会引起磁盘 IO 负载重),wa 的值持续很高,如高于 40,id 也持续高于 70,这些现象都表明系统的 IO 可能出现性能问题。可以进一步通过 iostat 命令分析,如下所示:
[root@dm8 ~]# iostat -x 1 5 |
查看 iostat 的结果时注意事项如下:
- 首先看 %util(服务 IO 的时间占总时间的百分比),如果这个值接近 100%,表示 IO 的请求很多(表示任务服务的所有时间几乎都用在 IO 上),这种现象表明磁盘 IO 性能出现瓶颈。
- 再看 await(表示每次io设备等待时间)和 svctm(表示每次 IO 设备服务时间,一般性能越好的磁盘,这个值越小)。
如果 svctm 接近 await ,说明 IO 几乎没有等待,每个 IO 设备都得到及时的响应。
如果 svctm 远小于 await ,说明 IO 等待队列可能很长,IO 的得到服务的时间将延长(排队+服务时间)。
- avgqu-sz:表示 IO 排队的现象,如果排队过长会影响 IO 的响应时间。
- r/s+w/s:可以计算当前系统的 iops(可以结合硬盘的测试或者硬件参数来衡量是否超过磁盘的 iops 最大值)。
通过 iostat 了解到如果磁盘 I/O 出现性能瓶颈,我们可以借助 pidstat ,定位出导致瓶颈的进程,分析进程的 I/O 行为,结合应用程序的原理,分析这些 I/O 的来源。




