Linux IO 问题分析利器--iostat_JAVA

一 前言

最近做数据库服务器的压测,观察数据库性能,同时也要关注磁盘的io具体表现。分析数据时会用到2个工具 iostat,本文重新温习一下该工具的用法。

二 iostat

在排查分析io问题时,可以使用iostat查看磁盘的IO性能状态数据。

2.1 参数介绍

iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]

常用参数

  1. -c: 输出cpu统计信息


  2. -d: 输出磁盘统计信息     注:默认是两个都输出


  3. -k|-m: kb/s|mb/s代替原来的块/s


  4. -t: 输出时打印收集信息时刻的时间   注:时间的打印格式和系统变量S_TIME_FORMAT相关


  5. -x: 输出详细的拓展统计数据,比如各种等待时间,队列,利用率等信息。


  6. interval [count] :interval是统计的时间间隔单位是scount则是统计次数

2.2 输出解释

常使用命令

iostat -kx 1

Linux IO 问题分析利器--iostat_JAVA_02

  1. rrqm/s:IO设备每秒读取请求有多少被merge

  2. wrqm/s:IO设备每秒写入请求有多少被merge


  3. 注:当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并merge

  4. r/s:IO设备每秒的发起的读请求次数

  5. w/s:IO设备每秒的写请求次数

  6. rkB/s:每秒读K字节数

  7. wkB/s:每秒写K字节数

  8. avgrq-sz:发送到设备的请求的平均大小,单位是扇区。

  9. avgqu-sz:平均请求队列的长度,队列长度越短越好。也是我们观察磁盘性能的核心指标。

  10. r_await:每个读请求耗费的平均时间,该时间等于IO设备读操作的时间和在队列中等待的时间。

  11. w_await:每个写请求耗费的平均时间,该时间等于IO设备读操作的时间和在队列中等待的时间。  

  12. await:每个IO请求的处理的平均时间(以毫秒为单位)。

  13. svctm:表示平均每次设备I/O操作的服务时间(以毫秒为单位)。

  14. %util:在统计时间内所有处理IO时间,除以总共统计时间。表示该设备的繁忙程度。例如,如果统计间隔1秒,该设备有0.5秒在处理IO,而0.5秒闲置,则该设备的%util = 0.5/1 = 50%。一般地,如果该参数是100%表示设备已经接近满负荷运行。


这里重点说一下 await ,svctm

关于 await和svctm

可以理解为IO请求的响应时间,包括队列等待时间和服务时间,我们分析IO问题时,如果await大于svctm,await-svctm差值越小,则说明队列时间越短, 反之差值越大,队列时间越长,说明磁盘io有性能问题。

需要注意到是

man 手册里面有注释 Warning! Do not trust this field any more. This field will be removed in a future sysstat version. 该参数的计算方式依赖 util,而util其实不一定准确。因为util的计算方式未考虑并行处理io请求。详细的介绍请参考 《辩证看待 iostat》

2.3 常用命令

每隔2秒,显示一次设备统计信息, 可以看到全部设备的tps.

iostat -d  -k 1

Linux IO 问题分析利器--iostat_JAVA_03

查看指定设备 sdb磁盘的io统计信息,每秒展示一次输出。

iostat -xk sdb 1

Linux IO 问题分析利器--iostat_JAVA_04

2.4 await多大才算有问题

如前面介绍所说,await是单个I/O所消耗的时间,包括硬盘设备处理I/O的时间和I/O请求在kernel队列中等待的时间,正常情况下队列等待时间可以忽略不计,姑且把await当作衡量硬盘速度的指标吧,那么多大算是正常呢?对于SSD,从0.0x毫秒到1.x毫秒不等。在以下实例中,sdb是10块960G SSD做raid5,await是0.36毫秒,符合预期。

Device: rrqm/s wrqm/s r/s w/s       rkB/s wkB/s     avgrq-sz avgqu-sz await r_await w_await  svctm  %util
sdb     0.00   0.00  2.00 12525.00  32.00 105536.00 16.85     4.46    0.36    1.00    0.36   0.03  35.90

对磁盘阵列来说,因为有硬件缓存,写操作不等落盘就算完成,所以写操作的service time大大加快了,如果磁盘阵列的写操作不在一两个毫秒以内就算慢的了;读操作则未必,不在缓存中的数据仍然需要读取物理硬盘,单个小数据块的读取速度跟单盘差不多。

总结

虽然说iostat输出中 util 和srctm不一定准确,我们依然可以借助await 和 avgqu-sz的值合理的分析磁盘的io情况。然后结合系统的配置比如raid 卡,磁盘IO调度策略逐步分析。

推荐阅读

容易被误读的IOSTAT 

http://linuxperf.com/?p=156

辩证看待 iostat

https://zhuanlan.zhihu.com/p/33417860

Linux IO 问题分析利器--iostat_JAVA_05