引言
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選項互斥.
-p # 可以報告出每塊磁盤的每個分區的使用情況
-k # 以K為單位顯示每秒的磁盤請求數,默認單位塊.
-t # 在輸出數據時,打印搜集數據的時間.
-V # 打印版本號和幫助信息.
-n 顯示NFS(network filesystem)報告
-x # 輸出擴展信息.
iostat命令輸出說明1
[root@centos181002 ~]# iostat Linux 3.10.0-957.el7.x86_64 (centos181002) 2019年03月17日 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.67 0.00 9.07 0.02 0.00 90.23 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 55.56 65.91 27144.77 174751 71974361 sdb 0.04 1.03 0.00 2720 0 scd0 0.01 0.39 0.00 1028 0 dm-0 54.83 61.23 27144.00 162342 71972313 dm-1 0.03 0.93 0.00 2460 0 ## avg-cpu段: %user: 在用戶級別運行所使用的CPU的百分比. %nice: nice操作所使用的CPU的百分比. %sys: 在系統級別(kernel)運行所使用CPU的百分比. %iowait: CPU等待硬件I/O時,所占用CPU百分比. %idle: CPU空閑時間的百分比. ## Device段: tps 每秒I/O數(即IOPS。磁盤連續讀和連續寫之和) Blk_read/s 每秒從設備讀取的數據大小,單位是block/s(塊每秒) Blk_wrtn/s 每秒寫入設備的數量,單位是block/s Blk_read 從磁盤讀出的塊的總數 Blk_wrtn 寫入磁盤的塊的總數
iostat命令輸出說明2
[root@centos181002 ~]# iostat dxkt Linux 3.10.0-957.el7.x86_64 (centos181002) 2019年03月17日 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.65 0.00 9.05 0.56 0.00 89.73 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn 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%表示設備已經接近滿負荷運行了
環境
[root
第一步:Zabbix Agent端設置
1.安裝iostat
yum -y install sysstat
2.編寫自動發現磁盤腳本並給予執行權限
mkdir -p /etc/zabbix/scripts/
cat > /etc/zabbix/scripts/disk_discovery.sh <<\EOF
#!/bin/bash
############################################################
# $Name: disk_discovery.sh
# $Function: DISK DISCOVERY
# $Author: Xiaoliu.liu 1377133225@qq.com
# $organization: Xiaoliu.liu
# $Create Date: 2019/3/17
# $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"
EOF
cat /etc/zabbix/scripts/disk_discovery.sh
chmod +x /etc/zabbix/scripts/disk_discovery.sh
3.編寫監控磁盤IO腳本
cat > /etc/zabbix/scripts/disk_io.sh <<\EOF
#!/bin/bash
############################################################
# $Name: disk_discovery.sh
# $Function: DISK DISCOVERY
# $Author: Xiaoliu.liu 1377133225@qq.com
# $organization: Xiaoliu.liu
# $Create Date: 2019/3/17
# $Description: Monitor DISK DISCOVERY
############################################################
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}'
;;
#每秒讀數據量(MB)
rkb_s)
iostat -dxmt 1 2 | grep "\b$Device\b" | awk 'NR==2{print $6}'
;;
#每秒寫數據量(MB)
wkb_s)
iostat -dxmt 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}'
;;
#IOPS
iops)
iostat -dk 1 2 | grep "\bsda\b" | awk 'NR==2{print $2}'
;;
esac
EOF
cat /etc/zabbix/scripts/disk_io.sh
chmod +x /etc/zabbix/scripts/disk_io.sh
4.編輯zabbix_agentd的配置文件支持自定義腳本並
vim /etc/zabbix/zabbix_agentd.conf UnsafeUserParameters=1 Include=/etc/zabbix/zabbix_agentd.d/*.conf
5.創建disk_io的key文件
cat > /etc/zabbix/zabbix_agentd.d/disk_status.conf <<\EOF UserParameter=disk.discovery[*],/etc/zabbix/scripts/disk_discovery.sh UserParameter=disk.io[*],/etc/zabbix/scripts/disk_io.sh $1 $2 EOF cat /etc/zabbix/zabbix_agentd.d/disk_status.conf 參數說明: 其中的格式為UserParameter=<key>,<command> <key>:就是在web端添加監控腳本時的key值 <command>:就是該key值對應的執行腳本,也就是腳本執行路徑
6.重啟Zabbix Agent服務
systemctl restart zabbix-agent.service
7.在Zabbix Server端測試
zabbix_get -s 11.11.11.62 -k 'disk.discovery[*]' [root
第二步:Zabbix Server端導入模板並關聯到主機即可。
模板下載:https://pan.baidu.com/s/10Jcwt2ScdjW_rwHdz7QBdw
提取碼: tqzw
鏈接:https://pan.baidu.com/s/1sJ68wDarGP6I9aqxA5d5Ww 密碼:ssq8
在被監控端上模擬磁盤寫入進行測試
1 |
dd if=/dev/zero of=/a.txt bs=8k count=30000 |
轉自:https://www.jianshu.com/p/4b1c83d50e1a
