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),无法反应性能指标。