最近在看Linux I/O子系统相关的资料,需要监控每台服务器的磁盘I/O,特别是MongoDB数据库服务器的磁盘I/O,由于每台服务器的磁盘名称可能不一样,所以需要用到Zabbix的LLD功能来发现磁盘并监控I/O
参考文章
编写发现磁盘的脚步
shell版本disk_discovery.sh#!/bin/bash
diskarray=(`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
do
printf'\n\t\t{'
printf"\"{#DISK_NAME}\":\"${diskarray[$i]}\"}"
if[$i-lt$[$length-1]];then
printf','
fi
done
printf"\n\t]\n"
printf"}\n"
$shdisk_discovery.sh
{
"data":[
{"{#DISK_NAME}":"xvda"},
{"{#DISK_NAME}":"xvdb"}
]
}
python版本disk_discovery.py#/usr/bin/python
#Thisscriptisusedtodiscoverydiskontheserver
importsubprocess
importjson
args="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/sh
device=$1
item=$2
case$itemin
rrqm)
/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=,
#See'zabbix_agentd'directoryforexamples.
#
#Mandatory:no
#Default:
#UserParameter=
UserParameter=disk.discovery,/usr/bin/python/usr/local/zabbix/bin/disk_discovery.py
UserParameter=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便于查看。