设为首页 收藏本站
查看: 1275|回复: 0

[经验分享] zabbix实现对磁盘动态监控

[复制链接]

尚未签到

发表于 2015-9-9 11:48:45 | 显示全部楼层 |阅读模式
zabbix实现对磁盘动态监控



前言
  zabbix一直是小规模互联网公司服务器性能监控首选,首先是免费,其次,有专门的公司和社区开发维护,使其稳定性和功能都在不断地增强和完善。zabbix拥有详细的UI界面和分组策略,在被监控的服务器上安装好agent后,无需添加任何监控选项,因为zabbix自带一些必要的监控,如agent.ping之类,zabbix支持画图,这个是专门给boss们看的,极其重要。另外还支持用户自定义监控选项,这一点非常方便,今天我要说的就是磁盘监控,标题中为动态的监控,意指智能的识别磁盘个数,并生成相应的监控选项,因为每台服务器的磁盘可能不一样,所以我是使用zabbix的discovery方式。
  个人认为其UI界面是比较复杂的,但是毕竟越复杂越显得高端。我常用的不算configure和administration标签下所有的选项(这是必不可少的),也就graphs和screen,这两个选项是在monitor标签下的,也是BOSS们最关注的。

自动寻找磁盘
  说到底,所有的自动判断都是人为的设置好所有的可能性,然后根据实际情况从中选择,方法有很多,看大家具体要求。在这里,我要对磁盘监控,首先要找出有哪些磁盘,这里使用shell脚本实现。由于zabbix的discovery需要固定的格式,具体可以参考这里,最下面部分。
  脚本如下:




DSC0000.gif
1 #!/bin/bash
2 #written by lenwood
3 #mail:ccyhaoran@live.cn
4 diskarray=(`cat /proc/diskstats |grep -E "\bsd[abcdefg]\b|\bxvd[abcdefg]\b"|grep -i "\b$1\b"|awk '{print $3}'|sort|uniq   2>/dev/null`)
5 length=${#diskarray[@]}
6 printf "{\n"
7 printf  '\t'"\"data\":["
8 for ((i=0;i<$length;i++))
9 do
10         printf '\n\t\t{'
11         printf "\"{#DISK_NAME}\":\"${diskarray[$i]}\"}"
12         if [ $i -lt $[$length-1] ];then
13                 printf ','
14         fi
15 done
16 printf  "\n\t]\n"
17 printf "}\n"

  如上,这里通过读取/proc/diskstats,选择其中的磁盘,根据实际情况,我这里就找出类似sda或者xvda的,因为我们用的是sata接口的硬盘以及部分阿里云的服务器。
  脚本执行出来的结果类似如下





1 {
2     "data":[
3         {"{#DISK_NAME}":"sda"}
4         {"{#DISK_NAME}":"sdb"}
5     ]
6 }

  然后使用zabbix执行这个脚本,那么就要将其写到zabbix_agentd.conf中去,如下





UserParameter=io.scandisk
  • ,/infra/zabbix/os/disk_scan.sh $1


    iostat命令
      对于磁盘的监控我采用iostat命令,因为它能给出磁盘的详细信息,如扇区读写情况,io队列长度,iowait,svctime等等。
      命令如下:





    1 nohup iostat -m -x -d 30 >/tmp/iostat_output &

      通过tail -f /tmp/iostat_output,可获得iostat命令收集的磁盘信息,结果类似下面





    Device:         rrqm/s   wrqm/s   r/s   w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
    hda               0.00     0.20  0.00  7.43     0.00     0.16    43.28     0.23   30.80   2.43   1.81
    hda1              0.00     0.20  0.00  7.43     0.00     0.16    43.28     0.23   30.80   2.43   1.81
    hda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
    xvdb              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
    xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
    hdc               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

      其中部分参数的详细解释如下





    rrqm/s:   每秒进行 merge 的读操作数目。即 delta(rmerge)/s
    wrqm/s:  每秒进行 merge 的写操作数目。即 delta(wmerge)/s
    r/s:           每秒完成的读 I/O 设备次数。即 delta(rio)/s
    w/s:         每秒完成的写 I/O 设备次数。即 delta(wio)/s
    rsec/s:    每秒读扇区数。即 delta(rsect)/s
    wsec/s:  每秒写扇区数。即 delta(wsect)/s
    rkB/s:      每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)
    wkB/s:    每秒写K字节数。是 wsect/s 的一半。(需要计算)
    avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)
    avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
    await:    平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
    svctm:   平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
    %util:      一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)

      

    结合zabbix
      最开始已经说了,是结合zabbix的discovery功能,所以要对zabbix做出如下设置。
      (1)新建discovery规则
    DSC0001.jpg
      (2)新建好discovery rule之后,就可以开始写item prototypes了,下面是一个例子avgqu-sz(平均I/O队列长度)。
    DSC0002.jpg
      在建立好item之后,zabbix_agentd.conf中也要写上相应的UserParameters,如下。





    1 UserParameter=io.scandisk
  • ,/infra/zabbix/os/disk_scan.sh $1
    2 UserParameter=io.rps
  • ,/usr/bin/tail /tmp/iostat_output |grep "\b$1\b"|tail -1|awk '{print $$4}'
    3 UserParameter=io.wps
  • ,/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$5}'
    4 UserParameter=io.rMBps
  • ,/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$6}'
    5 UserParameter=io.wMBps
  • ,/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$7}'
    6 UserParameter=io.avgrq-sz
  • ,/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$8}'
    7 UserParameter=io.avgqu-sz
  • ,/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$9}'
    8 UserParameter=io.await
  • ,/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$10}'
    9 UserParameter=io.svctm
  • ,/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$11}'
    10 UserParameter=io.util
  • ,/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$12}'

      以上,监控的部分实际就已经完成。不过还要画图,也就是新建graph prototype了,如下图。
    DSC0003.jpg
      最后,看一下劳动成功,这样就实现了zabbix自动判断服务器上的磁盘个数,然后自动部署对应磁盘的监控并生成图表。
    DSC0004.jpg
      

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-111455-1-1.html 上篇帖子: zabbix监控windows 下篇帖子: 400 Bad Request
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表