一、监控原理
基本原理:通过分析/proc/diskstats文件,来对IO的性能进行监控。解释如下:
第一至第三个域,分别是主设备号,次设备号,设备名称
第4个域:读完成次数 ----- 读磁盘的次数,成功完成读的总次数。
第5个域:合并读完成次数, 第9个域:合并写完成次数。为了效率可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,才被计数(和排队),因此只有一次I/O操作。这个域使你知道这样的操作有多频繁。
第6个域:读扇区的次数,成功读过的扇区总次数。
第7个域:读花费的毫秒数,这是所有读操作所花费的毫秒数(用__make_request()到end_that_request_last()测量)。
第8个域:写完成次数 ----写完成的次数,成功写完成的总次数。
第9个域:合并写完成次数 -----合并写次数。
第10个域:写扇区次数 ---- 写扇区的次数,成功写扇区总次数。
第11个域:写操作花费的毫秒数 --- 写花费的毫秒数,这是所有写操作所花费的毫秒数(用__make_request()到end_that_request_last()测量)。
第12个域:正在处理的输入/输出请求数 -- -I/O的当前进度,只有这个域应该是0。当请求被交给适当的request_queue_t时增加和请求完成时减小。
第13个域:输入/输出操作花费的毫秒数 ----花在I/O操作上的毫秒数,这个域会增长只要field 9不为0。
第14个域:输入/输出操作花费的加权毫秒数 ----- 加权, 花在I/O操作上的毫秒数,在每次I/O开始,I/O结束,I/O合并时这个域都会增加。这可以给I/O完成时间和存储那些可以累积的提供一个便利的测量标准。
cat /proc/diskstats |grep sda |head -1
8 0 sda 20494 9008 921755 20814 1664897 1234103 23193116 5114244 0 2900808 5132892
二、实现脚本
vim disk_discovery.py
#/usr/bin/python
import subprocess
import json
args="cat /proc/diskstats |grep -E '\ssd[a-z]\s|\sxvd[a-z]\s|\svd[a-z]\s'|awk '{print $3}'|sort|uniq 2>/dev/null"
t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0]
disks=[]
for disk in t.split('\n'):
if len(disk) != 0:
disks.append({'{#DISK_NAME}':disk})
print json.dumps({'data':disks},indent=4,separators=(',',':'))
---------------------------------------------------------------------------------------------------------------
vim disk_status.sh
#/bin/sh
device=$1
DISK=$2
case $DISK in
read.ops)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $4}' #//磁盘读的次数
;;
read.ms)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $7}' #//磁盘读的毫秒数
;;
write.ops)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $8}' #//磁盘写的次数
;;
write.ms)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $11}' #//磁盘写的毫秒数
;;
io.active)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $12}' #//I/O的当前进度,
;;
read.sectors)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $6}' #//读扇区的次数(一个扇区的等于512B)
;;
write.sectors)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $10}' #//写扇区的次数(一个扇区的等于512B)
;;
io.ms)
/bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $13}' #//花费在IO操作上的毫秒数
;;
esac
---------------------------------------------------------------------------------------------------------------
配置zabbix客户端
UserParameter=disk.discovery,/usr/bin/python /opt/appl/zabbix/etc/shells/disk_discovery.py
UserParameter=disk.status[*],/opt/appl/zabbix/etc/shells/disk_status.sh $1 $2
测试结果:
zabbix_get -s 172.16.8.210 -k "disk.status[sda,ops]"
监控key值
disk.status[{#DISK_NAME},read.ops]
disk.status[{#DISK_NAME},read.ms]
disk.status[{#DISK_NAME},write.ops]
disk.status[{#DISK_NAME},write.ms]
disk.status[{#DISK_NAME},io.active]
disk.status[{#DISK_NAME},io.ms]
disk.status[{#DISK_NAME},read.sectors]
disk.status[{#DISK_NAME},write.sectors]
首先添加模板 ,然后在模板上添加监控项目
名称: {#DISK_NAME}磁盘读的次数
键值: disk.status[{#DISK_NAME},read.ops]
单位: ops/second
储存值:差量(每秒速率)
名称: {#DISK_NAME}磁盘写的次数
键值: disk.status[{#DISK_NAME},write.ops]
单位: ops/second
储存值:差量(每秒速率)
名称: {#DISK_NAME}磁盘读的毫秒数
键值: disk.status[{#DISK_NAME},read.ms]
单位: ms
储存值:差量(每秒速率)
名称: {#DISK_NAME}磁盘写的毫秒数
键值: disk.status[{#DISK_NAME},write.ms]
单位: ms
储存值:差量(每秒速率)
名称: {#DISK_NAME}读扇区的次数
键值: disk.status[{#DISK_NAME},read.sectors]
单位: B/sec
使用自定义倍数: 512
储存值:差量(每秒速率)
名称: {#DISK_NAME}写扇区的次数
键值: disk.status[{#DISK_NAME},write.sectors]
单位: B/sec
使用自定义倍数: 512
储存值:差量(每秒速率)
zabbix剩余磁盘空间 zabbix 磁盘io
转载文章标签 zabbix剩余磁盘空间 键值 设备号 vim 文章分类 运维
-
Linux 磁盘管理命令 quota:显示磁盘已使用的空间与限制quotacheck:检查磁盘的使用空间与限制quotaoff quotaon:关闭开启磁盘空间限制
Linux 磁盘管理命令 quota:显示磁盘已使用的空间与限制quotacheck:检查磁盘的使用空间与限制quotaoff:关闭磁盘空间限制 quotaon: 开启磁盘空间限制quotastats:显示磁盘空间限制repquota:检查磁盘空间限制的状态
Linux 磁盘管理命令 quota:显示磁盘已使用的空间与限制 quotaoff quotaon:关闭开