CentOS7配置磁盘IO监控

1、准备

CentOS7 安装zabbix-agent客户端

监控磁盘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 建立图形原型

Was this article helpful?

Related Articles