Zabbix自動發現並監控磁盤IO、報警


本文轉載自: https://www.93bok.com

引言

Zabbix並沒有提供模板來監控磁盤的IO性能,所以我們需要自己來創建一個,由於一台服務器中磁盤眾多,如果只有一兩台可以手動添加,但服務集群達到幾十那就非常麻煩,因此需要利用自動發現這個功能,自動發現后自動添加對服務器磁盤的監控,而且添加磁盤后也會自動添加到監控,實現自動化運維的效果,接下來我們就來看看怎么自動發現磁盤並自動監控磁盤的IO性能,再設置觸發器,IO達到閾值后發出報警

iostat簡介

iostat主要用於監控系統設備的IO負載情況,iostat首次運行時顯示自系統啟動開始的各項統計信息,之后運行iostat將顯示自上次運行該命令以后的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。所以在使用iostat監控系統IO負載的時候,不要直接iostat取結果,而是iostat -dxkt 1 2取結果,否則得到的數據根本不正確

iostat安裝

yum -y install sysstat
iostat常用參數說明
-c		#僅顯示CPU統計信息.與-d選項互斥.
-d		#僅顯示磁盤統計信息.與-c選項互斥.
-k		#以K為單位顯示每秒的磁盤請求數,默認單位塊.
-t		#在輸出數據時,打印搜集數據的時間.
-V		#打印版本號和幫助信息.
-x		#輸出擴展信息.

iostat命令輸出說明

PgmLAH.png

PgmX4A.png

圖一

avg-cpu段:

%user: 在用戶級別運行所使用的CPU的百分比.
%nice: nice操作所使用的CPU的百分比.
%sys: 在系統級別(kernel)運行所使用CPU的百分比.
%iowait: CPU等待硬件I/O時,所占用CPU百分比.
%idle: CPU空閑時間的百分比.

Device段:

tps: 每秒鍾發送到的I/O請求數.
Blk_read /s: 每秒讀取的block數.
Blk_wrtn/s: 每秒寫入的block數.
Blk_read:   讀入的block總數.
Blk_wrtn:  寫入的block總數.

圖二

rrqm/s:每秒讀請求被合並次數
wrqm/s:每秒寫請求被合並次數
r/s:每秒完成的讀次數
w/s:每秒完成的寫次數
rkB/s:每秒讀數據量(kb)
wkB/s:每秒寫數據量(kb)
avgrq-sz:平均每次IO請求的扇區大小
avgqu-sz:平均每次IO請求的隊列長度(越短越好)

await:平均每次IO請求等待時間(毫秒),一般的系統IO等待時間應該低於5ms,如果大於10ms就比較大了。這個時間包括了隊列時間和服務時間,也就是說,一般情況下,await大於svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長,說明系統出了問題。

r_await:讀的平均耗時(毫秒)
w_await:寫入平均耗時(毫秒)

svctm:平均每次IO請求處理時間(毫秒),如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠高於svctm的值,則表示I/O隊列等待太長,系統上運行的應用程序將變慢。

%util:IO隊列非空比例,該參數暗示了設備的繁忙程度。一般地,如果該參數是100%表示設備已經接近滿負荷運行了

一、在被監控端上編寫自動發現和監控磁盤IO腳本

1、創建zabbix腳本存放目錄
mkdir -p /etc/zabbix/scripts
2、編寫自動發現磁盤腳本
vim /etc/zabbix/scripts/disk_discovery.sh

#!/bin/bash
############################################################
# $Name:         disk_discovery.sh
# $Function:     DISK DISCOVERY
# $Author:       Mr.nong
# $organization: nongziyi.xin
# $Create Date:  2018/1/25
# $Description:  Monitor DISK DISCOVERY
############################################################

disk_array=(`grep -E "(vd[a-z]$|sd[a-z]$)" /proc/partitions | awk '{print $4}'`)
length=${#disk_array[@]}
printf "{\n"
printf  '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
        printf '\n\t\t{'
        printf "\"{#DISK_NAME}\":\"${disk_array[$i]}\"}"
        if [ $i -lt $[$length-1] ];then
                printf ','
        fi
done
printf  "\n\t]\n"
printf "}\n"
3、編寫監控磁盤IO腳本
vim /etc/zabbix/scripts/disk_io.sh

#!/bin/bash
############################################################
# $Name:         disk_io.sh
# $Function:     DISK IO
# $Author:       Mr.nong
# $organization: nongziyi.xin
# $Create Date:  2018/1/25
# $Description:  Monitor DISK IO
############################################################

Device=$1
DISK=$2

case $DISK in

#每秒讀請求被合並次數
rrqm_s)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $2}'
;;

#每秒寫請求被合並次數
wrqm_s)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $3}'
;;

#每秒完成的讀次數
r_s)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $4}'
;;

#每秒完成的寫次數
w_s)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $5}'
;;

#每秒讀數據量(kb)
rkb_s)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $6}'
;;

#每秒寫數據量(kb)
wkb_s)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $7}'
;;

#平均每次IO請求的扇區大小
avgrq_sz)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $8}'
;;

#平均每次IO請求的隊列長度(越短越好)
avgqu_sz)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $9}'
;;

#平均每次IO請求等待時間(毫秒)
await)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $10}'
;;

#讀的平均耗時(毫秒)
r_await)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $11}'
;;

#寫入平均耗時(毫秒)
w_await)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $12}'
;;

#平均每次IO請求處理時間(毫秒)
svctm)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $13}'
;;

#IO隊列非空比例
util)
        iostat -dxkt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $14}'
;;

esac

4、給予腳本執行權限
chmod +x /etc/zabbix/scripts/disk_*
5、編輯zabbix_agentd的配置文件支持自定義腳本
vim /etc/zabbix/zabbix_agentd.conf

UnsafeUserParameters=1
6、編輯zabbix_agentd的配置文件添加zabbix配置文件目錄
vim /etc/zabbix/zabbix_agentd.conf

Include=/etc/zabbix/zabbix_agentd.conf.d/
7、創建disk_io的key文件
vim /etc/zabbix/zabbix_agentd.conf.d/disk_status.conf

UserParameter=disk.discovery[*],/etc/zabbix/scripts/disk_discovery.sh
UserParameter=disk.io[*],/etc/zabbix/scripts/disk_io.sh $1 $2
參數說明:
其中的格式為UserParameter=<key>,<command>

<key>:就是在web端添加監控腳本時的key值
<command>:就是該key值對應的執行腳本,也就是腳本執行路徑
7、重啟zabbix_agentd服務
service zabbix_agentd restart
8、在zabbix server端進行測試
/a01/apps/zabbix/bin/zabbix_get -s 192.168.10.26 -k 'disk.discovery[*]'

Pgmv9I.png

9、到zabbix web前端創建模板
  • “配置”------“模板”------“創建模板”

Pgmx3t.png

10、創建應用集
  • “配置”------“模板”------“選中模板”------應用集”------“創建應用集”

Pgn9u8.png

11、創建自動發現規則
  • “配置”------“模板”------“選中模板”------“自動發現規則”------“創建自動發現規則”

PgnPHg.png

  • 上圖中的“數據更新間隔(秒)”可以調整為久一些,因為服務器添加硬盤不是每天都干的事,這里為了后邊驗證效果,我就不修改了
12、創建監控項原型(鍵值[]中的數值必須大寫,否則會報錯如下)
Cannot create item: item with the same key “diskio.x.[[xxxxxx]] already exists
  • 一個一個創建即可,這里只截圖一個作為參考

PgnFEQ.png

  • 創建為完成

PgnA4s.png

13、創建圖形原型(名稱后邊要帶哪個磁盤的動態名稱,否則會報錯如下)
zabbix3 Cannot create graph: graph with the same name "Disk IO" already exists

PgnmvV.png

14、查看是否獲取到數據(現在獲取到的數據都是0,稍候我們會進行測試)
  • 可以看到有sda和sdb兩塊磁盤被監控到數據了,因為我的這台服務器有兩塊磁盤
  • “監測中”------“最新數據”------“過濾器”------“應用”

PgnuuT.png

16、在被監控端上模擬磁盤寫入進行測試
dd if=/dev/zero of=/a.txt bs=8k count=3000000
17、查看我們創建的圖形

PgnKDU.png

二、新添一塊磁盤,看看是否能自動發現磁盤並監控

  • 添加硬盤,分區,格式化過程省略,這里我添加了一塊5G硬盤,分區格式化之后掛載在/mnt下,添加完之后直接上zabbix web頁面查看是否自己生成圖像

PgnMbF.png

Pgn359.png

三、配置觸發器,達到閾值報警

A、IO請求等待時間(await)大於10ms則報警

  • “配置”------“選擇主機”------“自動發現規則”------“觸發器類型”------“創建觸發器原型”

PgnGCR.png

PgnYgx.png

上圖中的參數說明:
1、監控項:定義被監控項的閾值

2、功能:功能說起來比較麻煩,但是並不難理解,我舉個例子,假如設定,一個養雞場的溫度不能低於30度,如果低於30度,則報警;那么我也可以設定,如果溫度等於30度,我們就報警;或者說,如果溫度高於30度就報警。那到底是低於,等於,還是高於,這得看我們自己怎么設定。還有就是,我們還可以設定,如果5分鍾前的檢測低於/等於/高於30度,報警;甚至還可以這樣,如果連續10分鍾內獲取的溫度值的平均值都低於/等於/高於30度,報警。那么在zabbix中,怎樣實現這樣靈活的設定呢,就是通過“功能”欄定義的,比如,最近T次監測或者T分鍾內的監測,養雞場的溫度出現了小於N度的情況,在功能欄中可以選擇“最新的T值<N”。

3、最后一個(T):我們在“功能”中,已經選擇了某種定義,比如“最新的T值<N”,那么T是以時間為單位呢,還是以次數為單位呢,如果我們想定義“最近的第T次,養雞場的溫度小於30度”,那么此處需要選擇“計數”。如果我們想要定義“最近T分鍾內,養雞場的溫度小於30度”,那么此處需要選擇“時間”。

4、排班:如果我們想要定義“最近T分鍾內,養雞場的溫度小於30度”,則“最后一個(T)”需要選擇“時間”,同時在此處指明時間長度,默認單位是秒。

5、N:此處用於設置N的值,比如“最近一次監測的養雞場溫度小於30度”,那么這里N就是30。

在本例中,我監控了await這個數值,整個觸發器的意思就是:在最近的3次監測中,await的狀態都大於10,則報警。

B、IO隊列非空比例(%util)大於80%時報警

  • “配置”------“選擇主機”------“自動發現規則”------“觸發器類型”------“創建觸發器原型”

Pgntv6.png

PgnUKK.png

四、再次模擬磁盤寫入,測試會不會觸發到報警

dd if=/dev/zero of=/a.txt bs=8k count=3000000

PgnaDO.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM