1、准备
监控磁盘IO是使用IOSTAT工具,默认CentOS7已经安装,如果系统没有此工具,要先安装
[root@CentOS7 ~]# yum install sysstat -y
[root@CentOS7 ~]# iostat
Linux 3.10.0-1062.el7.x86_64 (CentOS7) 08/26/2020 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.05 0.00 0.09 0.05 0.00 99.81
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.40 9.68 4.70 237261 115160
dm-0 0.37 8.84 4.00 216700 98072
dm-1 0.00 0.09 0.00 2204 0
dm-2 0.00 0.05 0.08 1256 2048
查看Zabbix Agent配置
[root@CentOS7 ~]# egrep -v "#|^$" /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.86.0.60
ServerActive=127.0.0.1
Hostname=CentOS7
Include=/etc/zabbix/zabbix_agentd.d/
[root@CentOS7 ~]#
Zabbix配置文件存放路径在 /etc/zabbix/zabbix_agentd.d/
2、部署脚本
2.1创建一个存放脚本的目录
[root@CentOS7 ~]# mkdir -p /etc/zabbix/zabbix_agentd.d/scripts/
2.2 编辑发现磁盘脚本
[root@CentOS7 ~]# vi /etc/zabbix/zabbix_agentd.d/scripts/disk_discovery.sh
#!/bin/bash
diskarray=(`cat /proc/diskstats |grep -E "\bsd[a-z]\b|\bxvd[a-z]\b|\bvd[a-z]\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"
2.2编辑磁盘状态脚本
[root@CentOS7 ~]# vi /etc/zabbix/zabbix_agentd.d/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
参数详解:
rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
rps: 每秒完成的读 I/O 设备次数。即 delta(rio)/s
wps: 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s: 每秒读扇区数。即 delta(rsect)/s
wsec/s: 每秒写扇区数。即 delta(wsect)/s
rkBps: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)
wkBps: 每秒写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的单位为毫秒)
2.3授予脚本可执行权限
[root@CentOS7 ~]# chmod +x /etc/zabbix/zabbix_agentd.d/scripts/disk_discovery.sh
[root@CentOS7 ~]# chmod +x /etc/zabbix/zabbix_agentd.d/scripts/zabbix-iostat.sh
2.5 在/etc/zabbix/zabbix_agentd.d/下增加配置文件
[root@CentOS7 zabbix_agentd.d]# cd /etc/zabbix/zabbix_agentd.d/
[root@CentOS7 zabbix_agentd.d]# vi iostat.conf
UserParameter=disk.discovery[*],/etc/zabbix/zabbix_agentd.d/scripts/disk_discovery.sh
UserParameter=iostat[*],/etc/zabbix/zabbix_agentd.d/scripts/zabbix-iostat.sh "$1" "$2"
2.6 重启zabbix-agent服务
[root@CentOS7 ~]# systemctl restart zabbix-agent
2.7 在Zabbix服务器端验证脚本运行:10.1.1.31为客户端的IP地址
[root@CentOS7 ~]# zabbix_agentd -t iostat[discovery]
iostat[discovery] [t|{"data":[{"{#DEVICENAME}":"sda"},{"{#DEVICENAME}":"dm-0"},{"{#DEVICENAME}":"dm-1"},{"{#DEVICENAME}":"dm-2"}]}]
[root@CentOS7 ~]#
2.8 添加执行iostat计划
# 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 )
重启计划任务
[root@CentOS7 ~]# service crond restart
2.9 获取数据测试
[root@CentOS7 ~]# zabbix_agentd -t iostat[dm-1,rkb/s]
iostat[dm-1,rkb/s] [t|0.0015]
3. Zabbix-web 端配置
3.1 新建模板,命名为Template_Linux_Disk_IO ,加入到Template模板组中
3.2 新建一个自动发现规则
3.3 创建多个监控项原型
3.4 建立触发器类型,这个可根据实际需求是否创建
3.5 建立图形原型