zabbix监控磁盘IO
我这里有两种方法,感觉都不错。我这里主要是写一下监控的脚本。
1、使用iostat命令监控
1)首先打开配置文件的自定义脚本功能,然后编写脚本。
#!/bin/bash
if [ $# -ne 1 ];then
echo "Follow the script name with an argument"
fi
case $1 in
rrqm)
iostat -dxk 1 2|grep -w vda |tail -1 |awk '{print $2}'
;;
wrqm)
iostat -dxk 1 2|grep -w vda |tail -1 |awk '{print $3}'
;;
rps)
iostat -dxk 1 2|grep -w vda |tail -1 |awk '{print $4}'
;;
wps)
iostat -dxk 1 2|grep -w vda |tail -1 |awk '{print $5}'
;;
rKBps)
iostat -dxk 1 2|grep -w vda |tail -1 |awk '{print $6}'
;;
wKBps)
iostat -dxk 1 2|grep -w vda |tail -1 |awk '{print $7}'
;;
avgrq-sz)
iostat -dxk 1 2|grep -w vda | tail -1 |awk '{print $8}'
;;
avgqu-sz)
iostat -dxk 1 2|grep -w vda |tail -1 |awk '{print $9}'
;;
await)
iostat -dxk 1 2|grep -w vda|tail -1 |awk '{print $10}'
;;
svctm)
iostat -dxk 1 2|grep -w vda |tail -1 |awk '{print $13}'
;;
util)
iostat -dxk 1 2|grep -w vda |tail -1 |awk '{print $14}'
;;
*)
echo -e "\e[033mUsage: sh $0 [rrqm|wrqm|rps|wps|rKBps|wKBps|avgqu-sz|avgrq-sz|await|svctm|util]\e[0m"
esac
2)添加至agent的脚本路径里面。
完成之后就可以在zabbix里面添加items了
2、第二种方法,
第二种是使用iotop命令来获取数据
#!/bin/bash
#Date: 2016/11/11
#Author:zhangjie
disk_read(){
NUM=`/usr/bin/sudo iotop -b -n 3 -d 1| grep "Total DISK READ" | grep -v grep | awk -F "|" '{print $1}' | awk -F ":" '{print $2}' | tail -n1 | awk -F "/" '{print $1}'`
NUM2=`echo $NUM | awk '{print $1}'`
UNIT=`echo $NUM | awk '{print $2}'`
if [ $UNIT == "B" ];then
echo $NUM2
elif [ $UNIT == "K" ];then
NUM3=$(echo "$NUM2 * 1024" | bc)
echo $NUM3
elif [ $UNIT == "M" ];then
NUM3=$(echo "$NUM2 * 1024 * 1024" | bc)
echo $NUM3
elif [ $UNIT == "G" ];then
NUM3=$(echo "$NUM2 * 1024 * 1024 * 1024" | bc)
echo $NUM3
fi
}
disk_write(){
NUM=`/usr/bin/sudo iotop -b -n 3 -d 1 | grep "Total DISK WRITE :" | grep -v grep | awk -F "|" '{print $2}' | awk -F ":" '{print $2}' | tail -n1 | awk -F "/" '{print $1}'`
NUM2=`echo $NUM | awk '{print $1}'`
UNIT=`echo $NUM | awk '{print $2}'`
if [[ $UNIT == "B" ]];then
echo $NUM2
elif [[ $UNIT == "K" ]];then
NUM3=$(echo "$NUM2 * 1024" | bc)
echo $NUM3
elif [[ $UNIT == "M" ]];then
NUM3=$(echo "$NUM2 * 1024 * 1024" | bc)
echo $NUM3
elif [[ $UNIT == "G" ]];then
NUM3=$(echo "$NUM2 * 1024 * 1024 * 1024" | bc)
echo $NUM3
fi
}
main(){
case $1 in
disk_read)
disk_read;
;;
disk_write)
disk_write;
;;
esac
}
main $1
编写完脚本以后,我们还需要再做一件事情,修改sudoers文件
把这个添加注释,去掉此功能。
完成之后就可以进行监控了。
上面是两个脚本,选择任意一个都是可以的,接下来就是按照下面的步骤添加items,可能稍有出入,需酌情修改。
3、接下来开始进行测试:在server端使用zabbix_get命令测试脚本是否正确:
[root@ELK-chaofeng zabbix_agentd.d]# zabbix_get -s 127.0.0.1 -p 10050 -k io_check['wKBps']
40.00
[root@ELK-chaofeng zabbix_agentd.d]# zabbix_get -s 127.0.0.1 -p 10050 -k IO_check['disk_write']
87.00
3、看的出来没有什么问题,那么此时我们在zabbix的监控界面进行添加。
4、添加item
5、填写内容即可
填写完之后点击“update”保存
6、添加graph
还是在这个界面点击“graph”
7、添加graph
8、填写内容
添加成功后我们就可以查看了。
9、最后我们看看效果(我这里以上面的第二个脚本为例)
可以看到没有什么问题。
疑难总结:之前的脚本中,出来的图像是断断续续的,感觉挺是奇怪的。感觉像是时间间隔采集数据的问题。
就是出现上面的这种情况。items里面的监控项是没有问题,显示是正常的。
然后我换一种方式查看,发现确实read上有很长一段时间没有数据出现。感觉很不对劲。
后来在脚本中的iotop命令中,将iotop命令后面的参数修改了一下成功了:“iotop -b -n 3 -d 1” ,-d表示多长时间采集一次数据,-n表示采集数据的次数。之前我设置的是0.2秒采集一次数据,现在看来是不合适的。可能这个数值最好与zabbix界面的items里面的“update inteval”保持一致最好,都是1s。
此外,iotop命令第三次采集的数据是稍微稳定点的。所以最好采集3次以上的数据。
修改好之后,我们再次来看看效果:
发现这个时候是正常的了。
再来看看时间间隔:
发现时间间隔也是有序的,看来就没有什么毛病了。整个监控搭建成功了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
2016-01-19 DataGuard主备归档存在gap的处理办法
2016-01-19 Oracle主库归档丢失,备库日志有gap,在不重建备库的情况下,恢复备库
2014-01-19 CentOS 6.5安全加固及性能优化
2014-01-19 Linux系统部署规范v1.0