zabbix3.2.7之监控硬盘

一、监控硬盘脚本

#脚本存放目录
[root@zabbix-client-node1]# cd /etc/zabbix/zabbix_agentd.d [root@zabbix-client-node1 zabbix_agentd.d]# vi disk_scan.sh #!/bin/bash diskarray=(`cat /proc/diskstats |grep -E "\bsd[abcdefg]\b|\bvd[abcdefg]\b"|grep -i "\b$1\b"|awk '{print $3}'|sort|uniq 2>/dev/null`) length=${#diskarray[@]} printf "{\n" printf '\t'"\"data\":[" for ((i=0;i<$length;i++)) do printf '\n\t\t{' printf "\"{#DISKNAME}\":\"${diskarray[$i]}\"}" if [ $i -lt $[$length-1] ];then printf ',' fi done printf "\n\t]\n" printf "}\n"

#添加执行权限

[root@zabbix-client-node1 scripts]# chmod a+x disk_scan.sh 

[root@zabbix-client-node1 zabbix_agentd.d]# ll
total 8
-rwxr-xr-x 1 root root  465 Sep 22 03:53 disk_scan.sh

#获取返回值

[root@zabbix-client-node1 zabbix_agentd.d]# su -s /bin/bash zabbix
bash-4.2$ /etc/zabbix/zabbix_agentd.d/disk_scan.sh 
{
    "data":[
        {"{#DISKNAME}":"sda"}
    ]
}

#在zabbix agent通过iostat获取硬盘性能信息,并将该信息写入文本中

bash-4.2$ nohup iostat -m -x -d 30 >> /tmp/iostat_output

返回结果:

nohup: ignoring input and redirecting stderr to stdout  #会一直停在这里

#为了以后方便使用,可将该命令写入到自动启动中。

 
二、iostat的性能参数
[root@zabbix-client-node1 ~]# iostat -mx -d 30  
Linux 3.10.0-327.el7.x86_64 (zabbix-client-node1)     09/22/2017     _x86_64_    (2 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.03    0.45    0.20     0.01     0.00    51.82     0.00    1.62    0.88    3.30   0.50   0.03
scd0              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00    0.91    0.91    0.00   0.91   0.00
dm-0              0.00     0.00    0.41    0.21     0.01     0.00    52.14     0.00    2.21    0.96    4.65   0.51   0.03
dm-1              0.00     0.00    0.01    0.00     0.00     0.00    16.95     0.00    0.08    0.08    0.00   0.07   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00    0.13     0.00     0.00     7.25     0.00    1.00    0.00    1.00   1.00   0.01
scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.13     0.00     0.00     7.25     0.00    1.00    0.00    1.00   1.00   0.01
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.03    0.00    0.17     0.00     0.00     9.00     0.00    1.20    0.00    1.20   0.60   0.01
scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.20     0.00     0.00     7.50     0.00    1.33    0.00    1.33   0.50   0.01
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

 参数说明

单独执行iostat,显示的结果为从系统开机到当前执行时刻的统计信息。以上输出中,除最上面指示系统版本、主机名和日期的一行外,另有两部分:
avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值;
Device: 各磁盘设备的IO统计信息.
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数
r/s: 每秒完成的读次数
w/s: 每秒完成的写次数
rkB/s: 每秒读数据量(kB为单位)
wkB/s: 每秒写数据量(kB为单位)
avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
avgqu-sz: 平均等待处理的IO请求队列长度
await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm: 平均每次IO请求的处理时间(毫秒为单位)
%util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
注意:
iostat在Centos7系统中多了两个参数
r_await 
w_await 
[root@zabbix-client-node1 ~]# iostat -dxkt
Linux 3.10.0-327.el7.x86_64 (zabbix-client-node1)     09/22/2017     _x86_64_    (2 CPU)

09/22/2017 06:03:34 AM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.03    0.45    0.20    14.71     1.90    51.63     0.00    1.62    0.88    3.28   0.50   0.03
scd0              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00    0.91    0.91    0.00   0.91   0.00
dm-0              0.00     0.00    0.40    0.21    14.14     1.72    51.92     0.00    2.20    0.96    4.60   0.51   0.03
dm-1              0.00     0.00    0.01    0.00     0.09     0.00    16.95     0.00    0.08    0.08    0.00   0.07   0.00

三、通过python脚本获取磁盘方法

[root@zabbix-client-node1]# cd /etc/zabbix/zabbix_agentd.d

[root@zabbix-client-node1 zabbix_agentd.d]# vi disk_discovery.py

#/usr/bin/python
#This script is used to discovery disk on the server
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=(',',':'))

运行结果:

[root@zabbix-client-node1 zabbix_agentd.d]# python disk_discovery.py 
{
    "data":[
        {
            "{#DISK_NAME}":"sda"
        }
    ]
}

 四、zabbix 添加磁盘剩余容量监控方法

 

1、新建监控模板

Configuration--Templates--Create template

在Template name中输入disk space 50Gb 然后,保存即可。

2、新建Items

Name为The free disk space is less than 50Gb

key为:vfs.fs.size[/data,free]  

保存即可

3、创建Triggers

Trigger的名字为The free disk space is less than 50Gb

Expression为{disk space 50Gb:vfs.fs.size[/data,free].last()}<50000000000

4、效果显示

五、zabbix自动发现监控磁盘(iops和读写量)

利用zabbix的自动发现把每个磁盘的iops监控起来

思路:自动发现所有的磁盘,然后监控各个磁盘的iops

解决思路:

1、自动发现列出所有磁盘

#在客户端上面操作(zabbix-client-node01)

#zabbix脚本存放路径

[root@zabbix-client-node1 ~]# mkdir /usr/local/zabbix
[root@zabbix-client-node1 ~]# cd /usr/local/zabbix/

[root@zabbix-client-node1 zabbix]# ll
total 8
-rwxr-xr-x 1 root root 1062 Sep 28 2017 check_disk.sh
-rwxr-xr-x 1 root root 460 Sep 28 2017 discover_disk.py

discover_disk.py

#coding:utf-8
try:
    import json
except:
    import simplejson as json

import commands

(status, output) = commands.getstatusoutput('''cat /proc/diskstats |awk '{print $3}'|egrep 'sd|vd|hd'|egrep -v '[0-9]'|sort -u''')
if output:
        outputs = output.split('\n')
        disks = []
        for disk in  outputs:
            disks += [{'{#DISKONE}': disk}]
        print json.dumps({'data':disks},sort_keys=True,indent=4)
else:
        print 'discovery error'

#添加执行权限

[root@zabbix-client-node1 zabbix]# chmod a+x discover_disk.py

[root@zabbix-client-node1 zabbix]# ll
total 12
-rwxr-xr-x 1 root root  460 Sep 28 07:44 discover_disk.py

运行结果:

[root@zabbix-client-node1 zabbix]# python discover_disk.py 
{
    "data": [
        {
            "{#DISKONE}": "sda"
        }
    ]
}

2、监控每个磁盘的iops情况

vi check_disk.sh

#!/bin/sh
#   8       0 sda 76880282531 8117316 937263519846 4237854729 62989000438 35668103347 777694636224 1190396494 3 2895102137 899093508
while getopts "d:o:" opt
do
        case $opt in
                d ) disk=$OPTARG;;
                o ) option=$OPTARG;;
                ? )
                echo 'parameter is wrong!'
                exit 1;;
        esac
done
if [ ! "${disk}" ] || [ ! "${option}" ];then
        echo "parameter is null"        
        exit 1
fi

if [[ ${option} == "read" ]];then
    cat /proc/diskstats |grep "${disk} "|awk '{print $6}'
elif [[ ${option} == "write" ]];then
    cat /proc/diskstats |grep "${disk} "|awk '{print $10}'
elif [[ ${option} == "readops" ]];then
    cat /proc/diskstats |grep "${disk} "|awk '{print $4}'
elif [[ ${option} == "writeops" ]];then
        cat /proc/diskstats |grep "${disk} "|awk '{print $8}'
elif [[ ${option} == "readtime" ]];then
        cat /proc/diskstats |grep "${disk} "|awk '{print $7}'
elif [[ ${option} == "writetime" ]];then
        cat /proc/diskstats |grep "${disk} "|awk '{print $11}'
fi

#添加执行权限

[root@zabbix-client-node1 zabbix]# chmod a+x check_disk.sh 

[root@zabbix-client-node1 zabbix]# ll
total 16
-rwxr-xr-x 1 root root 1062 Sep 28 07:45 check_disk.sh

运行结果:(脚本是以传参的方式运行

[root@zabbix-client-node1 zabbix]# sh check_disk.sh -d sda -o writeops
22040[root@zabbix-client-node1 zabbix]# sh check_disk.sh -d sda -o readops
6083

#在客户端上面操作(zabbix-client-node01)

[root@zabbix-client-node1 zabbix]# cd /etc/zabbix

[root@zabbix-client-node1 zabbix]# ll
total 24
-rw-r--r-- 1 root root 10354 Sep 24 01:23 zabbix_agentd.conf
-rw-r--r-- 1 root root 11315 Sep 24 01:07 zabbix_agentd.conf.bak
drwxr-xr-x 2 root root    80 Sep 24 02:43 zabbix_agentd.d

#把脚本加到zabbix-agent配置文件中

[root@zabbix-client-node1 zabbix]# vi zabbix_agentd.conf

### Option: UserParameter
#       User-defined parameter to monitor. There can be several user-defined parameters.
#       Format: UserParameter=<key>,<shell command>
#       See 'zabbix_agentd' directory for examples.
#
# Mandatory: no
# Default:
# UserParameter=
UserParameter=disk.discover,python /usr/local/zabbix/discover_disk.py
UserParameter=disk.status[*],sh /usr/local/zabbix/check_disk.sh -d $1 -o $2

#重启zabbix-agent和查看启动状态

[root@zabbix-client-node1 zabbix]# systemctl restart zabbix-agent

[root@zabbix-client-node1 zabbix]# systemctl status zabbix-agent

● zabbix-agent.service - Zabbix Agent
Loaded: loaded (/usr/lib/systemd/system/zabbix-agent.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2017-09-24 02:47:32 CST; 11s ago
Process: 3548 ExecStop=/bin/kill -SIGTERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 3551 ExecStart=/usr/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS)
Main PID: 3553 (zabbix_agentd)
CGroup: /system.slice/zabbix-agent.service
├─3553 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
├─3554 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
├─3555 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
├─3556 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
├─3557 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
└─3558 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]

Sep 24 02:47:32 zabbix-client-node1 systemd[1]: Starting Zabbix Agent...
Sep 24 02:47:32 zabbix-client-node1 systemd[1]: PID file /run/zabbix/zabbix_agentd.pid not readable (y...art.
Sep 24 02:47:32 zabbix-client-node1 systemd[1]: Started Zabbix Agent.

#在服务端上面操作(zabbix-server)

#安装zabbix-get软件

[root@zabbix-server zabbix]# yum install zabbix-get

#获取客户端硬盘信息

[root@zabbix-server zabbix]# zabbix_get -s 192.168.30.21 -k disk.discover
{
    "data": [
        {
            "{#DISKONE}": "sda"
        }
    ]
}

#监控磁盘的结果如下

[root@zabbix-server zabbix]# zabbix_get -s 192.168.30.21 -k disk.status[sda,readops]
5383
[root@zabbix-server zabbix]# zabbix_get -s 192.168.30.21 -k disk.status[sda,writeops]
3590

#以上都测试没问题就可以在zabbix的页面上添加自动发现规则了。可以新建个模板,发现规则截图如下:

选择模板--->直接导入模板:zbx_export_templates_discover_disk.xml

自动发现发现所有的磁盘,发现后就要项目原型进行监控磁盘的iops了 ,{#DISKONE}代表每个磁盘。监控的项目配置如下:

把自动发现模板应用到主机后,监控的项目如下:

最后,附上zabbix监控磁盘ipos的模板的链接:

http://git.oschina.net/zhuangweihong/ops/blob/master/zbx_export_templates_discover_disk.xml?dir=0&filepath=zbx_export_templates_discover_disk.xml&oid=1b1864a25c8b016e4ff14fc35c9bbdb07235829e&sha=9562fe6af03280814dc421203c713e7de20228b6

 

 

 

 
posted @ 2017-09-21 20:57  努力哥  阅读(590)  评论(0)    收藏  举报