本文章介紹zabbix自動發現規則之磁盤IO監控的案例實踐。python
主機名:mysql-slave
mysql
首先在zabbix_agent下定義一個獲取磁盤IO信息的腳本:
ios
cat /etc/zabbix/scripts/disk_io.sh #!/bin/bash Disk=$1 Option=$2 case $Option in rrqm) iostat -dxk 1 2|grep "\b$Disk\b" |tail -1|awk '{print $2}' ;; wrqm) iostat -dxk 1 2|grep "\b$Disk\b" |tail -1|awk '{print $3}' ;; rps) iostat -dxk 1 2|grep "\b$Disk\b"|tail -1|awk '{print $4}' ;; wps) iostat -dxk 1 2|grep "\b$Disk\b" |tail -1|awk '{print $5}' ;; rKBps) iostat -dxk 1 2|grep "\b$Disk\b" |tail -1|awk '{print $6}' ;; wKBps) iostat -dxk 1 2|grep "\b$Disk\b" |tail -1|awk '{print $7}' ;; avgrq-sz) iostat -dxk 1 2|grep "\b$Disk\b" |tail -1|awk '{print $8}' ;; avgqu-sz) iostat -dxk 1 2|grep "\b$Disk\b" |tail -1|awk '{print $9}' ;; await) iostat -dxk 1 2|grep "\b$Disk\b" |tail -1|awk '{print $10}' ;; svctm) iostat -dxk 1 2|grep "\b$Disk\b" |tail -1|awk '{print $11}' ;; util) iostat -dxk 1 2|grep "\b$Disk\b" |tail -1|awk '{print $12}' ;; esac
簡單說一下這個iostat的指令:web
iostat是I/O statistics(輸入/輸出統計)的縮寫,用來動態監視系統的磁盤操做活動。sql
iostat[參數][時間][次數]shell
命令功能json
經過iostat方便查看CPU、網卡、tty設備、磁盤、CD-ROM 等等設備的活動狀況, 負載信息。bash
命令參數app
-C 顯示CPU使用狀況ide
-d 顯示磁盤使用狀況
-k 以 KB 爲單位顯示
-m 以 M 爲單位顯示
-N 顯示磁盤陣列(LVM) 信息
-n 顯示NFS 使用狀況
-p[磁盤] 顯示磁盤和分區的狀況
-t 顯示終端和CPU的信息
-x 顯示詳細信息
-V 顯示版本信息
disk屬性值說明:
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
定義自動發現規則的key
cat /etc/zabbix/scripts/disk_scan.py import subprocess import json args="cat /proc/diskstats|awk '{print $3}'|grep -E '^[a-z]+$'|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=(',',':'))
zabbix_agent配置文件
cat /etc/zabbix/zabbix_agentd.conf.d/userparameter_io.conf UserParameter=disk.io[*], sudo /etc/zabbix/scripts/disk_io.sh $1 $2 UserParameter=disk.scan[*], python /etc/zabbix/scripts/disk_scan.py $1
zabbix web界面建立模板
建立模板
設置模板名稱,所屬組和主機(自定義)
建立Discovery
設置Discovery
注意,這裏的key 是在zabbix_agent設置的disk.scan 的disk_scan.py腳本返回值
建立item
設置item
建立完item,以下:
返回mysql-slave主機界面查看item
查看最新數據
建立Graph
查看Graphs