使用zabbix监控linux的io

zabbix自带的监控linux的模板中并没有监控io这项,而实际生产中又需要监控io,如何监控呢。

错误的示例


这里我特意贴出错误的示例出来,是因为我在网上搜如何使用zabbix监控io的文章时,好多文章都在讲使用iostat这个命令。而我最开始也是这样做的,结果是错误的,妈的,被坑了。

$ iostat -dxk 1 1
Linux 2.6.32-431.el6.x86_64 (office)    05/22/2019      _x86_64_        (2 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.01     4.48    2.34    4.10  1065.02    34.29   341.50     0.00    0.34   0.20   0.13

rkB/s - 每秒读的字节数
wkB/s - 每秒写的字节数

乍一看,可以啊,只要把这两个值取出来,不就可以了,接下来在zabbix agent中,只要写个配置文件就行了,如下所示
cd /etc/zabbix/zabbix_agentd.d
vi userparameter_iostats.conf
UserParameter=system.io.readkbs,iostat -dxk 1 1 | tail -n +4 | awk '{sum+=$6} END {print sum}'
UserParameter=system.io.writekbs,iostat -dxk 1 1 | tail -n +4 | awk '{sum+=$7} END {print sum}'

然后添加监控项,添加图片,可是系统跑了很长的时间后发现怎么读和写都是一根直线,没有任何波澜,如下所示,这不合逻辑啊。

捕获

后来在看《高性能mysql》时,里面讲iostat的第一次出现的数据是从机器开启以来的平均值,而不是瞬时的值,原来是这样,难怪iostat -dxk 1 1的值基本上没什么变化。
使用iostat -dxk 1 5,后面几次的值才是瞬时的值

$ iostat -dxk 1 5
 Linux 2.6.32-431.el6.x86_64 (office)    05/22/2019      _x86_64_        (2 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
 sda               0.01     4.49    2.34    4.10  1065.02    34.36   341.50     0.00    0.34   0.20   0.13

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
 sda               0.00     0.00    2.00    0.00  1000.00     0.00  1000.00     0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
 sda               0.00     3.00    2.00   16.00  1000.00    76.00   119.56     0.00    0.22   0.11   0.20

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
 sda               0.00     7.00    4.00   10.00  2000.00    68.00   295.43     0.00    0.29   0.14   0.20

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
 sda               0.00     0.00    2.00    0.00  1000.00     0.00  1000.00     0.00    1.00   0.50   0.10

那就是说需要取iostat后面的几次的值,然后来个平均,这就麻烦了,还是去看zabbix自带的有没有这个监控项吧,使用iostat不靠谱。

正确的示例


zabbix监控io其实是有默认监控项的
vfs.dev.read[<device>,<type>,<mode>]
vfs.dev.write[<device>,<type>,<mode>]
具体说明看https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/zabbix_agent?s[]=vfs&s[]=dev&s[]=read
我这里给出我使用的键
vfs.dev.read[,ops]  #每秒读的次数
vfs.dev.read[,sps]  #每秒读的扇区数,每扇区是512bytes
vfs.dev.write[,ops]  #每秒写的次数
vfs.dev.write[,sps]  #每秒写的扇区数,每扇区是512bytes

可能大家会想,明明有bytes/s,为啥不使用bps呢,我开始也使用bps,结果报错
$ zabbix_get -s 10.30.10.32 -k 'vfs.dev.write[,bps]'
ZBX_NOTSUPPORTED: Invalid second parameter.

原因在于linux不支持bps,查看系统支持的情况看https://www.zabbix.com/documentation/3.0/manual/appendix/items/supported_by_platform

看下新的图片,有高有低才对嘛

捕获2

特别提醒


使用zabbix取的值
$ zabbix_get -s 10.30.10.32 -k 'vfs.dev.write[,sps]' #每秒写的扇区数
87.466667

$ zabbix_get -s 10.30.10.32 -k 'vfs.dev.read[,sps]' #每秒读的扇区数
4267.200000

使用iostat取的值

$ iostat -xd 5 10
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 1.80 2.40 3.59 2395.21 43.11 407.20 0.00 0.33 0.20 0.12

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 2.60 2.00 2.40 2000.00 40.00 463.64 0.00 0.23 0.14 0.06

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 2.40 2.40 3.40 2400.00 46.40 421.79 0.00 0.41 0.24 0.14

  

利用zabbix取出来的值刚好是两倍的iostat显示的值,这里可能是zabbix程序自身的一点瑕疵,所以应该是zabbix取的值/2 * 512bytes才是字节数。不过问题也不大,知道io什么时候高就行了。

原文地址:https://www.cnblogs.com/ddzj01/p/10907652.html