zabbix一直是小規模互聯網公司服務器性能監控首選,首先是免費,其次,有專門的公司和社區開發維護,使其穩定性和功能都在不斷地加強和完善。zabbix擁有詳細的UI界面和分組策略,在被監控的服務器上安裝好agent後,無需添加任何監控選項,由於zabbix自帶一些必要的監控,如agent.ping之類,zabbix支持畫圖,這個是專門給boss們看的,極其重要。另外還支持用戶自定義監控選項,這一點很是方便,今天我要說的就是磁盤監控,標題中爲動態的監控,意指智能的識別磁盤個數,並生成相應的監控選項,由於每臺服務器的磁盤可能不同,因此我是使用zabbix的discovery方式。ios
我的認爲其UI界面是比較複雜的,可是畢竟越複雜越顯得高端。我經常使用的不算configure和administration標籤下全部的選項(這是必不可少的),也就graphs和screen,這兩個選項是在monitor標籤下的,也是BOSS們最關注的。shell
說到底,全部的自動判斷都是人爲的設置好全部的可能性,而後根據實際狀況從中選擇,方法有不少,看你們具體要求。在這裏,我要對磁盤監控,首先要找出有哪些磁盤,這裏使用shell腳本實現。bash
腳本以下:服務器
cat diskstats.sh性能
#!/bin/bash
diskarray=(`cat /proc/diskstats |grep -E "\bsd[abcdefg][0-9]*\b|\bdm-[0-9]*\b"|grep -i "\b$1\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"測試
如上,這裏經過讀取/proc/diskstats,選擇其中的磁盤,根據實際狀況,我這裏就找出相似sda或者dm-的,必定要按實際狀況改寫腳本。blog
測試執行:zabbix_get -s 192.168.191.166 -k io.scandisk隊列
獲得以下信息:開發
{
"data":[
{"{#DISK_NAME}":"dm-0"},
{"{#DISK_NAME}":"dm-1"},
{"{#DISK_NAME}":"dm-2"},
{"{#DISK_NAME}":"sda"},
{"{#DISK_NAME}":"sda1"},
{"{#DISK_NAME}":"sda2"}
]
}get
而後使用zabbix執行這個腳本,那麼就要將其寫到zabbix_agentd.conf中去,以下:
UserParameter=io.scandisk[*],/infra/zabbix/os/disk_scan.sh $1
對於磁盤的監控我採用iostat命令,由於它能給出磁盤的詳細信息,如扇區讀寫狀況,io隊列長度,iowait,svctime等等。
命令以下:
nohup iostat -m -x -d 30 >/tmp/iostat_output &
經過tail -f /tmp/iostat_output,可得到iostat命令收集的磁盤信息,結果相似下面:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.43 1.63 66.07 0.09 0.45 16.55 0.47 6.90 8.41 6.86 4.75 32.18
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 1.63 66.47 0.09 0.45 16.45 0.47 6.93 8.39 6.89 4.73 32.19
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 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的discovery功能,因此要對zabbix作出以下設置。
這裏的鍵值必定要用在UserParameter裏定義好的鍵值才能把磁盤自動發現上來。
而後建監控項原型:
在創建好item以後,zabbix_agentd.conf中也要寫上相應的UserParameters,以下。
UserParameter=io.scandisk[*],/infra/zabbix/os/disk_scan.sh $1
UserParameter=io.rrqm[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b"|tail -1|awk '{print $$2}'
UserParameter=io.wrqm[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b"|tail -1|awk '{print $$3}'
UserParameter=io.rps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b"|tail -1|awk '{print $$4}'
UserParameter=io.wps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$5}'
UserParameter=io.rMBps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$6}'
UserParameter=io.wMBps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$7}'
UserParameter=io.avgrq-sz[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$8}'
UserParameter=io.avgqu-sz[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$9}'
UserParameter=io.await[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$10}'
UserParameter=io.svctm[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$11}'
UserParameter=io.util[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$12}'
建圖形原型:
最終效果圖: