zabbix實現對磁盤性能動態監控

前言

zabbix一直是小規模互聯網公司服務器性能監控首選,首先是免費,其次,有專門的公司和社區開發維護,使其穩定性和功能都在不斷地加強和完善。zabbix擁有詳細的UI界面和分組策略,在被監控的服務器上安裝好agent後,無需添加任何監控選項,由於zabbix自帶一些必要的監控,如agent.ping之類,zabbix支持畫圖,這個是專門給boss們看的,極其重要。另外還支持用戶自定義監控選項,這一點很是方便,今天我要說的就是磁盤監控,標題中爲動態的監控,意指智能的識別磁盤個數,並生成相應的監控選項,由於每臺服務器的磁盤可能不同,因此我是使用zabbix的discovery方式。ios

我的認爲其UI界面是比較複雜的,可是畢竟越複雜越顯得高端。我經常使用的不算configure和administration標籤下全部的選項(這是必不可少的),也就graphs和screen,這兩個選項是在monitor標籤下的,也是BOSS們最關注的。shell

自動尋找磁盤

說到底,全部的自動判斷都是人爲的設置好全部的可能性,而後根據實際狀況從中選擇,方法有不少,看你們具體要求。在這裏,我要對磁盤監控,首先要找出有哪些磁盤,這裏使用shell腳本實現。因爲zabbix的discovery須要固定的格式,具體能夠參考這裏,最下面部分。bash

腳本以下:服務器

 1 #!/bin/bash
 2 #written by Yiffy
 3 #mail:ccyhaoran@live.cn
 4 diskarray=(`cat /proc/diskstats |grep -E "\bsd[abcdefg]\b|\bxvd[abcdefg]\b"|grep -i "\b$1\b"|awk '{print $3}'|sort|uniq   2>/dev/null`)
 5 length=${#diskarray[@]}
 6 printf "{\n"
 7 printf  '\t'"\"data\":["
 8 for ((i=0;i<$length;i++))
 9 do
10         printf '\n\t\t{'
11         printf "\"{#DISK_NAME}\":\"${diskarray[$i]}\"}"
12         if [ $i -lt $[$length-1] ];then
13                 printf ','
14         fi
15 done
16 printf  "\n\t]\n"
17 printf "}\n"

如上,這裏經過讀取/proc/diskstats,選擇其中的磁盤,根據實際狀況,我這裏就找出相似sda或者xvda的,由於咱們用的是sata接口的硬盤以及部分阿里雲的服務器。性能

腳本執行出來的結果相似以下阿里雲

1 {
2     "data":[
3         {"{#DISK_NAME}":"sda"}
4         {"{#DISK_NAME}":"sdb"}
5     ]
6 }

而後使用zabbix執行這個腳本,那麼就要將其寫到zabbix_agentd.conf中去,以下spa

UserParameter=io.scandisk[*],/infra/zabbix/os/disk_scan.sh $1

iostat命令

對於磁盤的監控我採用iostat命令,由於它能給出磁盤的詳細信息,如扇區讀寫狀況,io隊列長度,iowait,svctime等等。prototype

命令以下:code

1 nohup iostat -m -x -d 30 >/tmp/iostat_output &

經過tail -f /tmp/iostat_output,可得到iostat命令收集的磁盤信息,結果相似下面blog

Device:         rrqm/s   wrqm/s   r/s   w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
hda               0.00     0.20  0.00  7.43     0.00     0.16    43.28     0.23   30.80   2.43   1.81
hda1              0.00     0.20  0.00  7.43     0.00     0.16    43.28     0.23   30.80   2.43   1.81
hda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
xvdb              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
hdc               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

其中部分參數的詳細解釋以下

rrqm/s:   每秒進行 merge 的讀操做數目。即 delta(rmerge)/s
wrqm/s:  每秒進行 merge 的寫操做數目。即 delta(wmerge)/s
r/s:           每秒完成的讀 I/O 設備次數。即 delta(rio)/s
w/s:         每秒完成的寫 I/O 設備次數。即 delta(wio)/s
rsec/s:    每秒讀扇區數。即 delta(rsect)/s
wsec/s:  每秒寫扇區數。即 delta(wsect)/s
rkB/s:      每秒讀K字節數。是 rsect/s 的一半,由於每扇區大小爲512字節。(須要計算)
wkB/s:    每秒寫K字節數。是 wsect/s 的一半。(須要計算)
avgrq-sz: 平均每次設備I/O操做的數據大小 (扇區)。delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O隊列長度。即 delta(aveq)/s/1000 (由於aveq的單位爲毫秒)。
await:    平均每次設備I/O操做的等待時間 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm:   平均每次設備I/O操做的服務時間 (毫秒)。即 delta(use)/delta(rio+wio)
%util:      一秒中有百分之多少的時間用於 I/O 操做,或者說一秒中有多少時間 I/O 隊列是非空的。即 delta(use)/s/1000 (由於use的單位爲毫秒)

 

結合zabbix

最開始已經說了,是結合zabbix的discovery功能,因此要對zabbix作出以下設置。

(1)新建discovery規則

(2)新建好discovery rule以後,就能夠開始寫item prototypes了,下面是一個例子avgqu-sz(平均I/O隊列長度)。

在創建好item以後,zabbix_agentd.conf中也要寫上相應的UserParameters,以下。

 1 UserParameter=io.scandisk[*],/infra/zabbix/os/disk_scan.sh $1
 2 UserParameter=io.rps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b"|tail -1|awk '{print $$4}'
 3 UserParameter=io.wps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$5}'
 4 UserParameter=io.rMBps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$6}'
 5 UserParameter=io.wMBps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$7}'
 6 UserParameter=io.avgrq-sz[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$8}'
 7 UserParameter=io.avgqu-sz[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$9}'
 8 UserParameter=io.await[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$10}'
 9 UserParameter=io.svctm[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$11}'
10 UserParameter=io.util[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$12}'

以上,監控的部分實際就已經完成。不過還要畫圖,也就是新建graph prototype了,以下圖。

最後,看一下勞動成功,這樣就實現了zabbix自動判斷服務器上的磁盤個數,而後自動部署對應磁盤的監控並生成圖表。

相關文章
相關標籤/搜索