linux磁盘i o跟踪,利用zabbix动态监控磁盘I/O

最近在看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|uniq   2>/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"

$ 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信息

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

#/bin/sh

device=$1

item=$2

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

### Option: UserParameter

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

#       Format: UserParameter=,

#       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

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

5.添加磁盘监控模板

763cf4d3f6eec3a4a99adeff31df8b1d.png

aa919830a97e933c7c4549da04a09398.png

wKioL1QC2EehTZuyAAI5***gslI105.jpg

5e881b367ec73226f8bd524179427ef0.png

b0ebab3f80cb68c1ea7e3e645a5cbde2.png

d6307e66339f20d64191671d9af064c4.png

dc93d3f1aff98d8deb1a89f1d46511af.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值