/proc/diskstats中记录着磁盘IO的状态信息,我们可以使用这个状态信息对磁盘IO进行监控。

[root@shijiange50 ~]# cat /proc/diskstats
8       0 sda 4049 0 285994 41118 833 914 116184 16840 0 28501 57470
8       1 sda1 4020 0 283906 40971 833 914 116184 16840 0 28499 57323
11       0 sr0 18 0 2056 639 0 0 0 0 0 633 639


/proc/diskstats文件里记录着磁盘的IO信息,每一行都有14列,分别代表的信息如下:

  1. 8:主设备号

  2. 1:次设备号

  3. sda1:磁盘名称,自动发现只监控sd、vd、hd开头

  4. 4020:总读次数

  5. 0:总合并读次数

  6. 283906:总读扇区次数,一扇区=512Bytes

  7. 40971:总读花费毫秒数

  8. 833:总写次数

  9. 914:总合并写次数

  10. 116184:总写扇区次数,一扇区=512Bytes

  11. 16840:总写花费毫秒数

  12. 0:正在处理的输入/输出请求数

  13. 28499:输入/输出操作花费的毫秒数

  14. 57323:输入/输出操作花费的加权毫秒数


监控磁盘IO的脚本disk_check.sh,我们监控关心第6、10个字段能够监控出每秒的读写字节数(注意乘以512),关心第4、8个字段能够监控出每秒的read数(read per second),每秒的write数(write per second)

disk=$1
option=$2
if [[ ${option} == "readbytes" ]];then
  result=$(cat /proc/diskstats |grep "${disk} "|awk '{print $6}')
  let result=$result*512
  echo $result
elif [[ ${option} == "writebytes" ]];then
  result=$(cat /proc/diskstats |grep "${disk} "|awk '{print $10}')
  let result=$result*512
  echo $result
elif [[ ${option} == "read" ]];then
  cat /proc/diskstats |grep "${disk} "|awk '{print $4}'
elif [[ ${option} == "write" ]];then
  cat /proc/diskstats |grep "${disk} "|awk '{print $8}'
fi


脚本运行结果如下

[root@shijiange50 ~]# sh /etc/zabbix/disk_check.sh sda read
4803
[root@shijiange50 ~]# sh /etc/zabbix/disk_check.sh sda write
1591


磁盘我们使用自动发现,Zabbix自动发现脚本disk_discovery.py

try:
  import json
except:
  import simplejson as json
import commands

(status, output) = commands.getstatusoutput(""" cat /proc/diskstats |awk '{print $3}'|egrep 'sd|vd|hd' """)
outputs = output.split('\n')
result = []
for one in  outputs:
  result.append( {'{#ONE}': one} )
print( json.dumps({'data':result},sort_keys=True,indent=4) )


自动发现运行结果如下

[root@shijiange50 ~]# python /etc/zabbix/disk_discovery.py 
{
    "data": [
        {
            "{#ONE}": "sda"
        }, 
        {
            "{#ONE}": "sda1"
        }
    ]
}


被监控的服务器Zabbix Agent需要添加如下配置,然后重启agent

UserParameter=diskio.discovery,python /etc/zabbix/disk_discovery.py
UserParameter=diskio.check[*],sh /etc/zabbix/disk_check.sh $1 $2


使用实践哥创建的Zabbix监控磁盘IO的模板,下载链接如下:

https://gitee.com/shijiange/ops/blob/master/Zabbix%E6%A8%A1%E6%9D%BF/zbx_diskio_template.xml


实战效果如下

Zabbix自动发现监控磁盘IO_第1张图片