linux磁盘监控--iostat一点小问题和util计算公式
iostat简介
iostat - Report Central Processing Unit (CPU) statistics and input/output statistics for devices, partitions and network filesystems (NFS)
通常用来看linux服务器io指标,也能看cpu,但是top看cpu比iostat猛,也能看网络指标NFS,但是sar又比iostat猛,所以就用来看io。
磁盘io负载通常影响线上数据落地,如果磁盘负载高,有很多请求在队列中来不及处理,导致线上数据处理延迟,因此需要个磁盘io负载的监控,笔者用的是iostat。
(base) [work@node1 wwwroot]$ iostat -zx
Linux 2.6.32-696.18.7.el6.x86_64 (ger-frankfurt-loget-dt-001) 12/11/2019 _x86_64_ (40 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
5.78 0.00 1.96 0.10 0.00 92.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 0.18 5.11 7.04 31.90 647.66 2769.29 87.76 0.05 1.22 2.55 0.93 0.24 0.92
scd0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 3.79 3.79 0.00 3.76 0.00
sdb 0.00 0.15 4.95 3.63 420.92 455.76 102.17 0.06 6.83 0.25 15.82 0.10 0.08
以上命令能统计磁盘io的繁忙程度,读取util即可反应出来。but磁盘负载明显满了,告警却没有,排查发现,命令【iostat -xz】打印一次统计记录,每个盘符一条记录数据,但是这条数据却是固定的,我石化了,
如下所示,第二次统计记录是真实数据。
(base) [work@node1 wwwroot]$ iostat -zx 1
Linux 2.6.32-696.18.7.el6.x86_64 (ger-frankfurt-loget-dt-001) 12/11/2019 _x86_64_ (40 CPU)
【我是假的】
avg-cpu: %user %nice %system %iowait %steal %idle
5.78 0.00 1.96 0.10 0.00 92.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 0.18 5.11 7.04 31.90 647.64 2768.94 87.75 0.05 1.20 2.55 0.91 0.24 0.92
scd0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 3.79 3.79 0.00 3.76 0.00
sdb 0.00 0.15 4.95 3.62 420.93 455.61 102.28 0.06 6.83 0.25 15.85 0.10 0.08
【我是真的】
avg-cpu: %user %nice %system %iowait %steal %idle
18.85 0.00 7.12 39.22 0.00 34.81
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 0.00 0.00 2.00 238.00 264.00 117144.00 489.20 138.23 738.70 660.50 739.35 4.17 100.10
sdb 0.00 5.00 15.00 1375.00 120.00 19024.00 13.77 10.85 7.81 0.00 7.89 0.06 8.30
【我是真的】
avg-cpu: %user %nice %system %iowait %steal %idle
20.02 0.00 7.25 37.41 0.00 35.32
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 2.00 2.00 2.00 74.00 136.00 35880.00 473.89 133.12 472.54 479.00 472.36 13.14 99.90
sdb 0.00 1.00 13.00 3289.00 104.00 42992.00 13.05 26.25 7.95 0.46 7.98 0.06 19.70
【我是真的】
avg-cpu: %user %nice %system %iowait %steal %idle
19.89 0.00 7.29 42.86 0.00 29.96
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 1.00 1.00 7.00 6.00 1064.00 3072.00 318.15 135.67 1655.85 747.57 2715.50 76.92 100.00
sdb 0.00 0.00 14.00 2897.00 112.00 30664.00 10.57 22.76 7.82 1.14 7.85 0.06 17.90
avg-cpu: %user %nice %system %iowait %steal %idle
22.64 0.00 7.71 32.16 0.00 37.49
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 12.00 36.00 22.00 614.00 7464.00 75232.00 130.03 153.18 678.43 165.18 696.82 1.57 100.00
sdb 0.00 1.00 17.00 3382.00 136.00 44016.00 12.99 29.80 8.77 0.18 8.81 0.07 22.40
读第二次数据解决问题
iostat -zx 1 2
统计两次数据,取第二次的,这也是奇葩。
关键指标释义--util公式
瑕不掩瑜,小毛病虽然让人尴尬,但是看磁盘io还是iostat猛。
整点关注3个指标:
1、avgqu-sz:请求队列长度。
2、svctm:平均io处理时长(毫秒)。
3、%util:io繁忙程度,就是负载强度。
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数
r/s: 每秒完成的读次数
w/s: 每秒完成的写次数
rkB/s: 每秒读数据量(kB为单位)
wkB/s: 每秒写数据量(kB为单位)
avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
avgqu-sz: 平均等待处理的IO请求队列长度
await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm: 平均每次IO请求的处理时间(毫秒为单位)
%util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
对于以上示例输出,我们可以获取到以下信息:
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 12.00 36.00 22.00 614.00 7464.00 75232.00 130.03 153.18 678.43 165.18 696.82 1.57 100.00
每秒有636次IO操作(r/s+w/s),其中以写操作为主体
平均每次IO请求等待处理的时间为678.43毫秒,处理耗时为1.57毫秒
等待处理的IO请求队列中,平均有153.18个请求驻留
公式
util = (r/s+w/s) * (svctm/1000)
对于上面的例子有:util = (22+614)*(1.57/1000) = 0.999