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

本文主要分为3个部分

第一部分 前言,主要说说需求和获取数据的命令

第二部分 zabbix,主要说如何利用lld获得想要监控的数据

第三部分 ansible,主要提供一个ansible playbook来分发该监控所需的文件

第一部分 前言部分

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

这是具体的命令:

1
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呢?

我们用

1
iostat -x -d -m 1

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

命令的输出格式如下:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/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

1
2
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,用来分发脚本等工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- 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:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值