您好,登錄后才能下訂單哦!
最近在看Linux I/O子系統相關的資料,需要監控每臺服務器的磁盤I/O,特別是MongoDB數據庫服務器的磁盤I/O,由于每臺服務器的磁盤名稱可能不一樣,所以需要用到Zabbix的LLD功能來發現磁盤并監控I/O
參考文章
http://www.programering.com/a/MDOwYDNwATc.html
編寫發現磁盤的腳步
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信息
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=<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
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.添加磁盤監控模板
在添加item的時候注意,由于使用的是iostat -k 獲取每秒的讀寫大小,所以iostat顯示的是以KB為單位,在zabbix上以B為基本單位,需要用到Use custom multiplier 這個選項將zabbix agent返回的KB值乘以1024變成B,然后zabbix agent再以B為單位顯示成B或KB或MB便于查看。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。