利用Zabbix动态监控磁盘I/O

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

参考文章

1.编写发现磁盘的脚步

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|uniq  2>/dev/null`)

length=${#diskarray[@]}

printf "{\n"

printf  '\t'"\"data\":["

for ((i=0;i<$length;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"


   

$ sh disk_discovery.sh

{

"data":[

{"{#DISK_NAME}":"xvda"},

{"{#DISK_NAME}":"xvdb"}

]

}

Python版本disk_discovery.py

#/usr/bin/python

#This script is used to discovery disk on the server

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('\n'):

if len(disk) != 0:

disks.append({'{#DISK_NAME}':disk})

print json.dumps({'data':disks},indent=4,separators=(',',':'))

$ python disk_discovery.py

{

"data":[

{

"{#DISK_NAME}":"xvda"

},

{

"{#DISK_NAME}":"xvdb"

}

]

}

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


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

#/bin/sh

device=$1

item=$2

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

case $item in

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

Timeout=10

### Option: UserParameter

#      User-defined parameter to monitor. There can be several user-defined parameters.

#      Format: UserParameter=<key>,<shell command>

#      See 'zabbix_agentd' directory for examples.

#

# 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默认的Timeout值为3秒,由于这里使用iostat -ydxkt 1 3,每隔1秒刷新一次,刷新3次,所以如果获取磁盘信息Timeout设置时间短了的话会出现ZBX_NOTSUPPORTED这样的错误

然后重新加载zabbix agent

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

$ /usr/local/zabbix/bin/zabbix_get -s 192.168.1.190 -p 10055 -k "disk.discovery"

{

"data":[

{

"{#DISK_NAME}":"xvda"

},

{

"{#DISK_NAME}":"xvdb"

},

{

"{#DISK_NAME}":"xvdc"

}

]

}

$ /usr/local/zabbix/bin/zabbix_get -s 192.168.1.190 -p 10055 -k "disk.status[xvda,wps]"10.00

一些Zabbix相关教程集合

安装部署分布式监控系统Zabbix 2.06

《安装部署分布式监控系统Zabbix 2.06》

CentOS 6.3下Zabbix安装部署

Zabbix分布式监控系统实践

CentOS 6.3下Zabbix监控apache server-status

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/46293313f7d0e0d625310f8c603b5813.html