SSD磁盘util接近 100%代表磁盘慢吗

问题现象

集群中查看到ssd磁盘(做cache盘)io util使用率接近100%,需要判读是否达到了磁盘瓶颈。

问题调查

参考 iostat 的文档, 和 别人的blog 都有提到, iostat 的utils 并不能反映新的支持并发的设备,比如ssd, raid等:

  %util
         Percentage  of  elapsed time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is
         close to 100% for devices serving requests serially.  But for devices serving requests in parallel, such as RAID arrays  and  modern  SSDs,  this  number  does  not
         reflect their performance limits.

另外,可以参开 https://brooker.co.za/blog/2014/07/04/iostat-pct.html 文章《Two traps in iostat: %util and svctm》

在x86 上也试了一下, 通过读cache盘:

fio -name test -rw randread -filename /dev/sdr -runtime 60  -time_based=1 -direct=1 -ioengine libaio -numjobs=1 -iodepth=1 -eta-newline=1

read: IOPS=7872, BW=30.8MiB/s (32.2MB/s)(236MiB/7671msec)
Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00     9.00 7524.00  394.00    29.59     2.37     8.27     0.42    0.18    0.13    1.14   0.12  95.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00     0.00 8305.00   82.00    32.66     0.96     8.21     0.01    0.12    0.11    0.26   0.12  99.80

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00     0.00 8379.00   62.00    32.80     0.60     8.10     0.02    0.11    0.11    0.10   0.12  99.10

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00     8.00 7720.00  195.00    30.53     1.67     8.33     0.15    0.14    0.12    0.86   0.12  98.10

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00     4.00 8021.00   87.00    31.33     0.72     8.10     0.02    0.12    0.12    0.17   0.12  99.20

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00     5.00 7502.00  374.00    29.31     1.89     8.11     0.31    0.16    0.13    0.92   0.12  96.00

可以看到iops 在7000 左右, utils 已经100%了;但是如果增加iodepth:

fio -name test -rw randread -filename /dev/sdr -runtime 60  -time_based=1 -direct=1 -ioengine libaio -numjobs=1 -iodepth=128 -eta-newline=1

read: IOPS=129k, BW=505MiB/s (530MB/s)(18.1GiB/36746msec)
Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00    22.00 125637.00  667.00   491.68    13.65     8.19    10.29    0.35    0.34    1.90   0.01 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00     9.00 131418.00  136.00   513.60     1.39     8.02     1.59    0.24    0.24    0.52   0.01 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00     0.00 131817.00   43.00   514.91     0.34     8.00     0.23    0.21    0.21    0.19   0.01 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00     1.00 132226.00   81.00   517.15     1.23     8.02     0.67    0.23    0.23    0.63   0.01 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdr               0.00     0.00 130618.00   37.00   510.23     0.32     8.00     0.12    0.21    0.21    0.65   0.01 100.00

可以看到iops 12w , utils 也是100%。

也测试了下nvme 设备, 对应4k-1-1 , read 只有1w, 如果是 4k-1-128 read有 25w, 但他们的utils 都是100%。

问题原因

%util, it means "Percentage of CPU time during which I/O requests were issued to the device".

util参数代表的意思是“向设备发出I/O请求期间的CPU时间百分比”,这个值对于串行的设备(比如HDD机械磁盘)来说可以反映一个设备的繁忙程度,如果长时间运行大于90%,可能是慢盘。对于并行设备(比如SSD,固态磁盘),如果某时间段1个IO占用CPU时间会是100%,那么同时间段100个IO占用CPU时间可能也是100%,所以不能认为该设备达到了瓶颈。

要判断某个磁盘设备还需要分析其他参数比如await值、avgqu-sz等。

问题总结

io util% 参考值只针对 HDD 比较准确, 因为HDD 没有并发,不能反应SSD(并发设备)的能力。

猜你喜欢

转载自blog.51cto.com/wendashuai/2551080