磁盘 I/O 性能诊断

我们在 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 参数:我们可以获得更多统计信息。

iostat命令

  • 参数含义

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

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 进行控制
\-b --batch 非交互式模式,可以用于保存输出结果
\-n 刷新次数
\-d 刷新间隔时间
\-P 只显示进程,不显示线程
\-p 监控指定进程或线程
\-k 使用 KB 表示 I/O 带宽。默认情况下,iotop 使用 B/s,K/s,M/s 表示 I/O 带宽。
\-u 监控指定用户的 I/O 操作情况
\-t 在每行输出加上时间戳
\-q 只在第一次输出时显示列名称
\-qq 不显示列名称
\-qqq 不显示总的 I/O 信息

I/O 性能诊断

用 vmstat 命令了解系统状况

[root@dm8 ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 2074352  93616 732548    0    0    41    25   77   82  0  1 99  0  0
 0  0      0 2074600  93616 732548    0    0     0     8  128  194  0  0 100  0  0
 0  0      0 2074432  93616 732548    0    0     0     8  193  234  0  1 99  0  0
 0  0      0 2074416  93616 732548    0    0     0     8  121  194  0  0 100  0  0
 0  0      0 2074424  93616 732548    0    0     0    24  136  194  0  0 100  0  0
 0  0      0 2074700  93624 732540    0    0     0    80  771  721  0  2 98  0  0
 0  0      0 2074796  93624 732552    0    0     0     4  100  180  0  0 100  0  0
 0  0      0 2074672  93624 732552    0    0     0     8  107  179  0  0 100  0  0
 0  0      0 2074860  93624 732552    0    0     0     8  164  224  0  0 100  0  0
 0  0      0 2074596  93624 732552    0    0     0     8  114  187  0  0 100  0  0

如果 b 的值为 2~3 倍 CPU 数量,bi 和 bo 的值很大(有时 bi 和 bo 值很小,但 in 和 cs 很大,也会引起磁盘 IO 负载重),wa 的值持续很高,如高于 40,id 也持续高于 70,这些现象都表明系统的 IO 可能出现性能问题。可以进一步通过 iostat 命令分析,如下所示:

[root@dm8 ~]# iostat -x 1 5
Linux 2.6.32-642.kb5.ky3.x86_64 (dm8) 2020年11月02日_x86_64_ (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.09    0.00    0.72    0.03    0.00   99.17

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               3.04    19.26    3.90    4.33   312.06   188.78    60.85     0.02    2.07    0.36    3.61   1.70   1.40
dm-0              0.00     0.00    6.67   23.60   309.97   188.77    16.48     0.08    2.64    0.54    3.24   0.46   1.40
dm-1              0.00     0.00    0.07    0.00     0.57     0.00     8.00     0.00    0.22    0.22    0.00   0.13   0.00

查看 iostat 的结果时注意事项如下:

  1. 首先看 %util(服务 IO 的时间占总时间的百分比),如果这个值接近 100%,表示 IO 的请求很多(表示任务服务的所有时间几乎都用在 IO 上),这种现象表明磁盘 IO 性能出现瓶颈。
  2. 再看 await(表示每次io设备等待时间)和 svctm(表示每次 IO 设备服务时间,一般性能越好的磁盘,这个值越小)。

如果 svctm 接近 await ,说明 IO 几乎没有等待,每个 IO 设备都得到及时的响应。

如果 svctm 远小于 await ,说明 IO 等待队列可能很长,IO 的得到服务的时间将延长(排队+服务时间)。

  1. avgqu-sz:表示 IO 排队的现象,如果排队过长会影响 IO 的响应时间。
  2. r/s+w/s:可以计算当前系统的 iops(可以结合硬盘的测试或者硬件参数来衡量是否超过磁盘的 iops 最大值)。

通过 iostat 了解到如果磁盘 I/O 出现性能瓶颈,我们可以借助 pidstat ,定位出导致瓶颈的进程,分析进程的 I/O 行为,结合应用程序的原理,分析这些 I/O 的来源。

微信扫码
分享文档
扫一扫
联系客服