Linux HDD和SSD磁盘的util(iostat )指标问题

HDD和SSD磁盘的util指标问题

LInux环境中,在排查磁盘问题时,我们经常使用到iostat工具,这确实是一款非常优秀的工具。但是最近遇到了这么一个问题-ssd做缓存盘,发现业务量稍微上去,utils使用率就高于90%,是不是意味着磁盘出现慢盘了呢?

比如以下两组数据:

Device:     rrqm/s   wrqm/s       r/s     w/s    rkB/s    wkB/s avgrq-sz 
sdd           0.00     0.00  13823.00    0.00 55292.00     0.00     8.00
             avgqu-sz   await r_await w_await  svctm  %util
                 0.78    0.06    0.06    0.00   0.06  78.40

Device:     rrqm/s   wrqm/s       r/s     w/s    rkB/s    wkB/s avgrq-sz
sdd           0.00     0.00  72914.67    0.00 291658.67    0.00     8.00
             avgqu-sz   await r_await w_await  svctm  %util
                15.27    0.21    0.21    0.00   0.01 100.00

读io 13k,util使用率78%
读io 73k,util使用率100%
这里理论计算读io 18k就会打满磁盘。其实这里牵扯一个问题,就是ssd固态磁盘是支持并发IO的,这里util只能代表磁盘的繁忙程度,无法反应磁盘的性能指标等问题。

查看iostat的官方文档:

  %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://*er.co.za/blog/2014/07/04/iostat-pct.html

自测验证

在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%。

NOTE: iostat 的utils 性能指标反应只针对 hdd 比较准确, 因为hdd 没有并发(串行的)。对SSD磁盘没意义

总结:

iostat的util使用率,代表着磁盘的繁忙程度。对于机械磁盘HDD,可以反应性能指标;对于SSD(支持并行IO),无法反应性能指标。

Linux HDD和SSD磁盘的util(iostat )指标问题

上一篇:突破SSL Pinning抓app的数据包


下一篇:axios发delete请求,后台收不到参数;