最近在看Linux I/O子系统相关的资料,需要监控每台服务器的磁盘I/O,特别是MongoDB数据库服务器的磁盘I/O,由于每台服务器的磁盘名称可能不一样,所以需要用到Zabbix的LLD功能来发现磁盘并监控I/O

参考文章

http://www.programering.com/a/MDOwYDNwATc.html


编写发现磁盘的脚步

shell版本disk_discovery.sh

#!/bin/bashdiskarray=(`cat/proc/diskstats|grep-E"\bsd[a-z]\b|\bxvd[a-z]\b|\bvd[a-z]\b"|awk'{print$3}'|sort|uniq2>/dev/null`)length=${#diskarray[@]}printf"{\n"printf'\t'"\"data\":["for((i=0;i<$length;i++))doprintf'\n\t\t{'printf"\"{#DISK_NAME}\":\"${diskarray[$i]}\"}"if[$i-lt$[$length-1]];thenprintf','fidoneprintf"\n\t]\n"printf"}\n"

$shdisk_discovery.sh{"data":[{"{#DISK_NAME}":"xvda"},{"{#DISK_NAME}":"xvdb"}]}


python版本disk_discovery.py

#/usr/bin/python#Thisscriptisusedtodiscoverydiskontheserverimportsubprocessimportjsonargs="cat/proc/diskstats|grep-E'\ssd[a-z]\s|\sxvd[a-z]\s|\svd[a-z]\s'|awk'{print$3}'|sort|uniq2>/dev/null"t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0]disks=[]fordiskint.split('\n'):iflen(disk)!=0:disks.append({'{#DISK_NAME}':disk})printjson.dumps({'data':disks},indent=4,separators=(',',':'))


$pythondisk_discovery.py{"data":[{"{#DISK_NAME}":"xvda"},{"{#DISK_NAME}":"xvdb"}]}


2.编写获取磁盘I/O信息的脚本

使用iostat收集磁盘I/O信息

nohup /usr/bin/iostat -dxkt 1 > /tmp/iostat_output 2>/dev/null &


#/bin/shdevice=$1item=$2case$iteminrrqm)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$2}';;wrqm)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$3}';;rps)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$4}';;wps)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$5}';;rKBps)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$6}';;wKBps)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$7}';;avgrq-sz)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$8}';;avgqu-sz)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$9}';;await)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$10}';;svctm)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$11}';;util)/usr/bin/tail-n20/tmp/iostat_output|grep"\b$device\b"|tail-1|awk'{print$12}';;esac


3.修改Zabbix agent配置文件

添加disk_status.conf

###Option:UserParameter#User-definedparametertomonitor.Therecanbeseveraluser-definedparameters.#Format:UserParameter=<key>,<shellcommand>#See'zabbix_agentd'directoryforexamples.##Mandatory:no#Default:#UserParameter=UserParameter=disk.discovery,/usr/bin/python/usr/local/zabbix/bin/disk_discovery.pyUserParameter=disk.status[*],/usr/local/zabbix/bin/disk_status.sh$1$2


然后重新加载zabbix agent


4.通过在zabbix server或zabbix proxy端使用zabbix_get获取磁盘信息

$/usr/local/zabbix/bin/zabbix_get-s192.168.1.190-p10055-k"disk.discovery"{"data":[{"{#DISK_NAME}":"xvda"},{"{#DISK_NAME}":"xvdb"},{"{#DISK_NAME}":"xvdc"}]}$/usr/local/zabbix/bin/zabbix_get-s192.168.1.190-p10055-k"disk.status[xvda,wps]"10.00

5.添加磁盘监控模板


在添加item的时候注意,由于使用的是iostat -k 获取每秒的读写大小,所以iostat显示的是以KB为单位,在zabbix上以B为基本单位,需要用到Use custom multiplier 这个选项将zabbix agent返回的KB值乘以1024变成B,然后zabbix agent再以B为单位显示成B或KB或MB便于查看。