一、监控原理
基本原理:通过分析/proc/diskstats文件,来对IO的性能进行监控。/proc/diskstats文件详细内容此处不再讲解,详见/proc/diskstat文件讲解博客。
二、实现脚本
1.首先需要识别系统有哪些磁盘,在这里使用python脚本实现自动发现系统有哪些磁盘。
脚本如下:
# vim disk_discovery.py #/usr/bin/python import subprocess import json args="cat /proc/diskstats |grep -E 'ssd[a-z]s|sxvd[a-z]s|svd[a-z]s'| awk '{print $3}'|sort|uniq 2>/dev/null" t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0] disks=[] for disk in t.split(' '): if len(disk) != 0: disks.append({'{#DISK_NAME}':disk}) print json.dumps({'data':disks},indent=4,separators=(',',':'))
如上,这里通过分析/pro/diskstats文件,来找出系统中都有哪些磁盘。
脚本执行出来的结果类似如下:
{ "data":[ { "{#DISK_NAME}":"dm-0" }, { "{#DISK_NAME}":"dm-1" }, { "{#DISK_NAME}":"dm-2" }, { "{#DISK_NAME}":"sda" }, { "{#DISK_NAME}":"sdb" } ] }
2.通过脚本分析磁盘IO
# vim disk_status.sh #/bin/sh device=$1 DISK=$2 case $DISK in read.ops) /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $4}' #//磁盘读的次数 ;; read.ms) /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $7}' #//磁盘读的毫秒数 ;; write.ops) /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $8}' #//磁盘写的次数 ;; write.ms) /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $11}' #//磁盘写的毫秒数 ;; io.active) /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $12}' #//I/O的当前进度, ;; read.sectors) /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $6}' #//读扇区的次数(一个扇区的等于512B) ;; write.sectors) /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $10}' #//写扇区的次数(一个扇区的等于512B) ;; io.ms) /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $13}' #//花费在IO操作上的毫秒数 ;; esac
3.脚本写好后,需要在zabbix_agentd.conf配置文件中做出相应修改,修改内容如下:
# /usr/local/zabbix/etc/zabbix_agentd.conf
UnsafeUserParameters=1 是否启动用户自定义监控脚本(系统默认为0),1启用;0不启用。由于zabbix监控的方法多样性,一般都采用脚本来实现监控数据的采集,所以建议开启。
UserParameter=disk.discovery,/usr/bin/python /usr/local/zabbix/scripts/disk_discovery.py UserParameter=disk.status[*],/usr/local/zabbix/scripts/disk-status.sh $1 $2
注意:修改配置文件后需要重启zabbix_agentd服务,脚本放置路径与配置文件中要一致。
4.检测能否获取到key值
能否自动发现磁盘,有输出结果说明配置成功。
# /usr/local/zabbix/bin/zabbix_get -s 192.168.0.235 -k 'disk.discovery' { "data":[ { "{#DISK_NAME}":"dm-0" }, { "{#DISK_NAME}":"dm-1" }, { "{#DISK_NAME}":"dm-2" }, { "{#DISK_NAME}":"sda" }, { "{#DISK_NAME}":"sdb" } ] }
能否获取磁盘IO值,有输出结果说明配置成功。
# /usr/local/zabbix/bin/zabbix_get -s 192.168.0.235 -k 'disk.status[sda,read.ops]' 4297329
三、zabbix web界面配置
由于本人单台测试就没有创建模板,直接在需要监控的主机上添加的(服务器多的话会很麻烦)。也可以创建一个通用模板,后期设备多了后直接使用这个模板,会减少许多工作量。
进入web界面-->Configuration-->Hosts-->想要监控主机的Discovery-->Create discovery rule
填写规则名称跟key,其余默认信息即可,填写好后点击add保存。
添加item prototypes,点击item prototypes-->create item prototypes。填写对应信息。
说明:创建item时要注意的是,item prototypes名称、item key都需要使用脚本中设置的变量{#DISK_NAME},来获取每一块设备名称。给item定义key,并且要传递两个参数$1,$2给监测脚本;其中$1需要传递变量{#DISK_NAME},$2传递一个监控值。依次创建其余item prototype,不在一一细说。
监控item prototypes名称及key名称
名称: {#DISK_NAME}磁盘读的次数
键值: disk.status[{#DISK_NAME},read.ops]
单位: ops/second
储存值:差量(每秒速率)
名称: {#DISK_NAME}磁盘写的次数
键值: disk.status[{#DISK_NAME},write.ops]
单位: ops/second
储存值:差量(每秒速率)
名称: {#DISK_NAME}磁盘读的毫秒数
键值: disk.status[{#DISK_NAME},read.ms]
单位: ms
储存值:差量(每秒速率)
名称: {#DISK_NAME}磁盘写的毫秒数
键值: disk.status[{#DISK_NAME},write.ms]
单位: ms
储存值:差量(每秒速率)
名称: {#DISK_NAME}读扇区的次数
键值: disk.status[{#DISK_NAME},read.sectors]
单位: B/sec
使用自定义倍数: 512
储存值:差量(每秒速率)
名称: {#DISK_NAME}写扇区的次数
键值: disk.status[{#DISK_NAME},write.sectors]
单位: B/sec
使用自定义倍数: 512
储存值:差量(每秒速率)
创建graph prototype ,点击graph prototype-->create graph prototype。填写对应信息。
注意:graph prototype name需要使用脚本中设置的变量{#DISK_NAME},来获取每一块设备名称。否则会报错,不能成功创建图形。点击Add prototype后会弹出所有设置好的item prototype,全选以后点击Add就能添加图形界面。
至此zabbix自动发现并监控磁盘IO完成,由于本人水平有限,在最后的图形配置这里遇到问题,查找许多资料以后才发现graph prototype name是需要使用脚本中设置的变量{#DISK_NAME},来获取每一块设备名称,而不是自己定义的。
下图为配置好后的显示效果。