Zabbix3.0.4利用iostat工具監控CentOS主機磁碟IO
該監控基於iostat,然後iostat 命令用來監視系統輸入/輸出裝置負載
1.安裝IOSTAT工具
# yum install sysstat -y
測試iostat 檢視所有硬碟io
avg-cpu: %user %nice %system %iowait %steal %idle
0.04 0.00 0.04 0.00 0.00 99.92
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
vda 0.10 0.23 0.92 447172 1765488
vdb 0.00 0.00 0.15 4298 277632
2.部署指令碼
# mkdir -p /usr/local/zabbix-agent/scripts/
# vim /usr/local/zabbix-agent/scripts/zabbix-iostat.sh
#!/bin/bash
ZBX_DEV="$1"
ZBX_METRIC="$2"
IOSTAT_LOG=/tmp/iostat.log
# Check iostat util
if ! which iostat 2>&1>/dev/null; then
>&2 echo "Can't find 'iostat' binary in \$PATH"
>&2 echo "Make sure that you've installed 'sysstat' package"
exit 1
fi
# Check args
[[ $# -lt 1 ]] && { echo "Give some more arguments, please :)"; exit 1; }
# Discovering devices and spits out JSON
if [ "$ZBX_DEV" = 'discovery' ]; then
iostat -d | \
tail -n +4 |
awk 'BEGIN {
ORS="";
print "{\"data\":["}
/\d/ {printf "%s{\"%s\":\"%s\"}", separator, "{#DEVICENAME}", $1, separator = ","}
END {print "]}" }'
exit 0
fi
# Test iostat log
[[ ! -f "${IOSTAT_LOG}" ]] && echo "[m|ZBX_NOTSUPPORTED] [No such file ${IOSTAT_LOG}]" && exit 1
# Parse iostat file
function parse_iostat() {
grep ${ZBX_DEV} ${IOSTAT_LOG} | \
tr ',' '.' | \
awk -v field="$1" '
{sum+=$field; n++;}
END {if (n > 0) print sum/n;
else {print "[m|ZBX_NOTSUPPORTED] [Nodata.]" > "/dev/stderr"; exit 1};}'
}
# Exec parse funcion with number of column
case ${ZBX_METRIC} in
rrqm/s ) parse_iostat '2';;
wrqm/s ) parse_iostat '3';;
r/r ) parse_iostat '4';;
w/r ) parse_iostat '5';;
rkb/s ) parse_iostat '6';;
wkb/s ) parse_iostat '7';;
avgrq-sz ) parse_iostat '8';;
avgqu-sz ) parse_iostat '9';;
await ) parse_iostat '10';;
r_await ) parse_iostat '11';;
w_await ) parse_iostat '12';;
svctm ) parse_iostat '13';;
util ) parse_iostat '14';;
* ) echo "[m|ZBX_NOTSUPPORTED] [Unsupported item key.]" && exit 1;;
esac
新增指令碼執行許可權
# chmod +x /usr/local/zabbix-agent/scripts/zabbix-iostat.sh
# 設定引數
# echo 'UserParameter=iostat[*],/usr/local/zabbix-agent/scripts/zabbix-iostat.sh "$1" "$2"' > /etc/zabbix/zabbix_agentd.d/iostat.conf
#重啟zabbix_agentd
service zabbix-agent restart
# 測試自動發現
zabbix_agentd -t iostat[discovery]
3.加入crontab
# crontab -e
* * * * * ( sleep 10 && iostat -dxk 1 20 > /tmp/iostat.tmp && mv /tmp/iostat.tmp /tmp/iostat.log )
* * * * * ( sleep 40 && iostat -dxk 1 20 > /tmp/iostat.tmp && mv /tmp/iostat.tmp /tmp/iostat.log )
# 重啟計劃任務
/etc/init.d/crond restart
測試監控項
# zabbix_agentd -t iostat[vda,rkb/s]
iostat[vda,rkb/s] [t|0.007]
影象展示
模板:
Template_Linux_DISK_IO_Discovery_English.xml
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>3.0</version>
<date>2017-07-27T06:45:24Z</date>
<groups>
<group>
<name>Templates</name>
</group>
</groups>
<templates>
<template>
<template>Template_Linux_DISK_IO_Discovery_English</template>
<name>Template_Linux_DISK_IO_Discovery_English</name>
<description>Low-Level Discovery disk devices and I/O Performance monitoring</description>
<groups>
<group>
<name>Templates</name>
</group>
</groups>
<applications>
<application>
<name>DISK/IO</name>
</application>
</applications>
<items/>
<discovery_rules>
<discovery_rule>
<name>Disk devices discovery</name>
<type>0</type>
<snmp_community/>
<snmp_oid/>
<key>iostat[discovery]</key>
<delay>300</delay>
<status>0</status>
<allowed_hosts/>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<delay_flex/>
<params/>
<ipmi_sensor/>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<filter>
<evaltype>0</evaltype>
<formula/>
<conditions>
<condition>
<macro>{#DEVICENAME}</macro>
<value>^(sd|hd|vd|xvd)[a-z]$</value>
<operator>8</operator>
<formulaid>A</formulaid>
</condition>
</conditions>
</filter>
<lifetime>30</lifetime>
<description>Disk devices discovery and IO Performance monitoring</description>
<item_prototypes>
<item_prototype>
<name>I/O Device /dev/$1 The average size (sector) of the disk each IO operation</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>iostat[{#DEVICENAME},avgrq-sz]</key>
<delay>30</delay>
<history>7</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>sectors</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The average size (in sectors) of the requests that were issued to the device.
向裝置發出的請求的平均大小(扇區)。</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>DISK/IO</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>I/O Device/dev/$1 Disk averages average IO requests per wait</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>iostat[{#DEVICENAME},await]</key>
<delay>30</delay>
<history>7</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>ms</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>await: 平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位)</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>DISK/IO</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>I/O Device /dev/$1 The number of sectors that the disk successfully reads per second</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>iostat[{#DEVICENAME},r/r]</key>
<delay>30</delay>
<history>7</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>Rps</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The number (after merges) of read requests completed per second for the device.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>DISK/IO</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>I/O Device /dev/$1 The size of the data that the disk is read per second</name>
<type>0</type>
<snmp_community/>
<multiplier>1</multiplier>
<snmp_oid/>
<key>iostat[{#DEVICENAME},rkb/s]</key>
<delay>30</delay>
<history>7</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>Bps</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1024</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The number of bytes read from the device per second
每秒從裝置讀取的位元組數</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>DISK/IO</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>I/O Device /dev/$1 The number of read requests merged per second that were queued to the device</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>iostat[{#DEVICENAME},rrqm/s]</key>
<delay>30</delay>
<history>7</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>rrqm/s</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The number of read requests merged per second that were queued to the device
每秒排隊到裝置上的合併請求數</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>DISK/IO</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>I/O Device /dev/$1 Disk average time per IO read request</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>iostat[{#DEVICENAME},r_await]</key>
<delay>30</delay>
<history>7</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>ms</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The average time (in milliseconds) for read requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them.
向裝置發出的讀取請求的平均時間(毫秒)。這包括佇列中請求的時間和為它們服務的時間。</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>DISK/IO</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>I/O Device /dev/$1The disk handles the percentage of all IO requests in CPU per unit time</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>iostat[{#DEVICENAME},util]</key>
<delay>30</delay>
<history>7</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>%</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>Percentage of elapsed time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100% for devices serving requests serially. But for devices serving requests in parallel, such as RAID arrays and modern SSDs, this number does not reflect their performance limits.
對裝置發出I/O請求的時間的百分比(裝置頻寬利用率)。裝置飽和發生時,這個值是接近100%的裝置服務請求連續。但在平行的服務請求的裝置,如磁碟陣列和現代固態硬碟,這個數字並不反映其效能極限。</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>DISK/IO</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>I/O Device /dev/$1 The number of sectors per disk successfully written per second</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>iostat[{#DEVICENAME},w/r]</key>
<delay>30</delay>
<history>7</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>Rps</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The number (after merges) of write requests completed per second for the device
每秒為裝置完成的寫入請求的數目(合併後)</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>DISK/IO</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>I/O Device /dev/$1 The size of data written by disk per second</name>
<type>0</type>
<snmp_community/>
<multiplier>1</multiplier>
<snmp_oid/>
<key>iostat[{#DEVICENAME},wkb/s]</key>
<delay>30</delay>
<history>7</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>Bps</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1024</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The number of bytes written to the device per second.
每秒寫入裝置的位元組數</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>DISK/IO</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>I/O Device /dev/$1 The number of times a disk writes per second</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>iostat[{#DEVICENAME},wrqm/s]</key>
<delay>30</delay>