Quantcast
Channel: CodeSection,代码区,Linux操作系统:Ubuntu_Centos_Debian - CodeSec
Viewing all articles
Browse latest Browse all 11063

使用iostat和LLD实现zabbix监控IO性能

$
0
0

前言部分

最近有一个需求是对系统的IO进行监控,最后决定从iostat获取数据。

这是具体的命令:

iostat -x -d -m 1 3

参数简单解析:

-x Display extended statistics

-d Display the device utilization report

-m Display statistics in megabytes per second instead of blocks or kilobytes per second

那么为什么要 1 3呢?

我们用

iostat -x -d -m 1

多次测试,会发现第一次输出的值变动不大,第二次,第三次输出的值会有一定的变化,因此我更偏向与取第二次,第三次的值做平均

命令的输出格式如下:

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

可以较好地满足我们的监控需求

zabbix部分

接下来,我们就用zabbix的LLD来自动发现当前系统的Device值

cat /etc/zabbix/scripts/io_discovery.py

#!/bin/env python import os import commands (status,output) = commands.getstatusoutput("iostat -x -d -m | sed -n '4,$p' | grep -v ^$| awk '{print $1}'") DISKS = output.split() print '{' print '\t"data":[' count = 1 for key in DISKS: print '\t{' if count < len(DISKS): print '\t\t"{#DISK}":"%s"},' % key else: print '\t\t"{#DISK}":"%s"}' % key count += 1 print '\t]' print '}'

拿到Device以后,用脚本来获取对应的数值

cat /etc/zabbix/scripts/userparameter_diskio.py

#!/bin/env python import commands import sys DISK = sys.argv[1] cmdline = 'cat /tmp/iostat.txt | grep %s' % DISK (status,output) = commands.getstatusoutput(cmdline) output_list = output.split() value = zip(*[iter(output_list)]*12) if sys.argv[2] == "rrqmps": print ((float(value[1][1])+float(value[2][1]))/2) elif sys.argv[2] == "wrqmps": print ((float(value[1][2])+float(value[2][2]))/2) elif sys.argv[2] == "rps": print ((float(value[1][3])+float(value[2][3]))/2) elif sys.argv[2] == "wps": print ((float(value[1][4])+float(value[2][4]))/2) elif sys.argv[2] == "rspeed": print ((float(value[1][5])+float(value[2][5]))/2) elif sys.argv[2] == "wspeed": print ((float(value[1][6])+float(value[2][6]))/2) elif sys.argv[2] == "await": print ((float(value[1][9])+float(value[2][9]))/2) elif sys.argv[2] == "svctm": print ((float(value[1][10])+float(value[2][10]))/2) elif sys.argv[2] == "util": print ((float(value[1][11])+float(value[2][11]))/2)

这里还需要一个crontab来生成/tmp/iostat.txt文件

* * * * * iostat -x -d -m 1 3 > /tmp/iostat.txt

接着写一个自定义配置文件

cat /etc/zabbix/zabbix_agentd.d/userparameter_diskio.conf

UserParameter=diskio_discovery[*],python /etc/zabbix/scripts/io_discovery.py UserParameter=diskio[*],python /etc/zabbix/scripts/userparameter_diskio.py $1 $2

接下来需要在zabbix上建一个监控模板,模板在附件里面, 本模板适用于zabbix3.2 ,其他版本请自行测试,可能需要做一些修改

都准备以后可以开始使用了

首先把相应的脚本和配置文件放到客户机上面,添加cron

接着把模板导入,在模板里面添加机器,然后restart zabbix 客户端

Ansible部分

如果你有使用ansible,我这里可以提供一个playbook,用来分发脚本等工作

- hosts: 客户机 tasks: - name: mkdir the scripts dir file: path=/etc/zabbix/scripts state=directory - name: copy conf files copy: src=/etc/zabbix/zabbix_agentd.d/userparameter_diskio.conf dest=/etc/zabbix/zabbix_agentd.d/ - name: copy io_discovery.py copy: src=/etc/zabbix/scripts/io_discovery.py dest=/etc/zabbix/scripts/io_discovery.py mode=0755 - name: copy userparameter_diskio.py copy: src=/etc/zabbix/scripts/userparameter_diskio.py dest=/etc/zabbix/scripts/userparameter_diskio.py mode=0755 - name: add cron cron: name='add iostat cron' minute='*' hour='*' day='*' month='*' weekday='*' job='iostat -x -d -m 1 3 > /tmp/iostat.txt' state=present notify: - restart zabbix-agent handlers: - name: restart zabbix-agent service: name=zabbix-agent state=restarted enabled=yes


Viewing all articles
Browse latest Browse all 11063