|
一、监控原理
基本原理:通过分析/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('\n'):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 "\b$device\b" | head -1 | awk '{print $4}' #//磁盘读的次数
;;
read.ms)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $7}' #//磁盘读的毫秒数
;;
write.ops)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $8}' #//磁盘写的次数
;;
write.ms)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $11}' #//磁盘写的毫秒数
;;
io.active)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $12}' #//I/O的当前进度,
;;
read.sectors)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $6}' #//读扇区的次数(一个扇区的等于512B)
;;
write.sectors)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $10}' #//写扇区的次数(一个扇区的等于512B)
;;
io.ms)
/bin/cat /proc/diskstats | grep "\b$device\b" | 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},来获取每一块设备名称,而不是自己定义的。
下图为配置好后的显示效果。
|
|
|