发布网友 发布时间:2022-04-21 19:12
共1个回答
热心网友 时间:2023-09-21 17:56
自动寻找磁盘
说到底,所有的自动判断都是人为的设置好所有的可能性,然后根据实际情况从中选择,方法有很多,看大家具体要求。在这里,我要对磁盘监控,首先要找出有哪些磁盘,这里使用shell脚本实现。由于zabbix的discovery需要固定的格式,具体可以参考这里,最下面部分。
脚本如下:
1 #!/bin/bash 2 #written by lenwood 3 #mail:ccyhaoran@live.cn 4 diskarray=(`cat /proc/diskstats |grep -E "\bsd[abcdefg]\b|\bxvd[abcdefg]\b"|grep -i "\b$1\b"|awk '{print $3}'|sort|uniq 2>/dev/null`) 5 length=${#diskarray[@]} 6 printf "{\n" 7 printf '\t'"\"data\":[" 8 for ((i=0;i<$length;i++)) 9 do10 printf '\n\t\t{'11 printf "\"{#DISK_NAME}\":\"${diskarray[$i]}\"}"12 if [ $i -lt $[$length-1] ];then13 printf ','14 fi15 done16 printf "\n\t]\n"17 printf "}\n"
如上,这里通过读取/proc/diskstats,选择其中的磁盘,根据实际情况,我这里就找出类似sda或者xvda的,因为我们用的是sata接口的硬盘以及部分阿里云的服务器。
脚本执行出来的结果类似如下
1 {2 "data":[3 {"{#DISK_NAME}":"sda"}4 {"{#DISK_NAME}":"sdb"}5 ]6 }
然后使用zabbix执行这个脚本,那么就要将其写到zabbix_agentd.conf中去,如下
UserParameter=io.scandisk[*],/infra/zabbix/os/disk_scan.sh $1
iostat命令
对于磁盘的监控我采用iostat命令,因为它能给出磁盘的详细信息,如扇区读写情况,io队列长度,iowait,svctime等等。
命令如下:
1 nohup iostat -m -x -d 30 >/tmp/iostat_output &
通过tail -f /tmp/iostat_output,可获得iostat命令收集的磁盘信息,结果类似下面
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
hda 0.00 0.20 0.00 7.43 0.00 0.16 43.28 0.23 30.80 2.43 1.81hda1 0.00 0.20 0.00 7.43 0.00 0.16 43.28 0.23 30.80 2.43 1.81hda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00xvdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00xvdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00hdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
其中部分参数的详细解释如下
rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/sw/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 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)