nagios監控linux磁碟io的bug

czxin788發表於2016-11-30
nagios監控linux磁碟io指令碼的一個bug

 今天,有人說oracle資料庫慢,來問我是不是oracle伺服器資源利用高,我說不會啊,如果伺服器效能有問題,nagios早就會給我報警了。
 於是,我就登入linux伺服器看一下top和free -m,發現cpu和記憶體一點都不高。然後又用iostat -x 1看,我去,util%都幹到100%,iowait 47%了。說明磁碟io很忙。
  可是,nagios監控的磁碟io為啥沒有告警呢。於是我手工執行nagios的指令碼:
root@ubnginx01 tmp]# /etc/nagios/libexec/check_iostat -w 6 -c 10
IOSTAT OK - user 0.50 nice 0.00 sys 0.00 iowait 0.00 idle 0.00  | iowait=0.30%;; idle=0.00%;; user=0.50%;; nice=0.00%;; sys=0.00%;;
 
   可以看到,check_iostat指令碼監控到的iowait值是0.03,而實際磁碟iowait是80%。
   我已經斷定是nagios的check_iostat指令碼出現問題了。
    在網上我也找了很多check_iostat指令碼,都沒什麼效果。很絕望。

    還是自己看看check_iostat裡面是怎麼寫的吧,雖然這個指令碼是perl寫的,但是能順藤摸瓜。看了check_iostat指令碼後,知道指令碼里面是透過命令iostat --c取值的。

[root@ubnginx01 tmp]# iostat  -c
Linux 2.6.32-431.el6.x86_64 (ubnginx01) 11/30/2016 _x86_64_ (4 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.16    0.00    0.10    0.96    0.00   98.78

      透過和iostat -c 1對比發現,iostat -c 1的第一次取的ioswait值永遠不準,第二次取的值才準:
     root@ubnginx01 ~]# iostat -c 1
Linux 2.6.32-431.el6.x86_64 (ubnginx01)     11/30/2016     _x86_64_    (4 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                    0.16    0.00    0.10    0.96    0.00   98.78
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                    0.25    0.00    3.27   46.73    0.00   49.75
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                    0.25    0.00    2.52   47.36    0.00   49.87
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                     0.50    0.00    2.76   46.98    0.00   49.75
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                     0.50    0.00    4.77   48.49    0.00   46.23
 
       透過上面可以看到,第一次iostat取的值是0.96,以後取值都是46左右。

      找到原因後,對nagios的check_iostat進行一下修改,即每次不取iostat -c 1的第一次值,而是取第二次的值:

        [root@ubnginx01 tmp]# cat /etc/nagios/libexec/check_iostat |grep \$iostat
          my $iostat = '';
  my $output = `$iostat -c 1 2 |tail -2`;
$iostat = $np->opts->get('iostat');
$iostat = 'iostat';

        也就是把my $output的值改成上述標紅字樣。



       再次執行check_iostat指令碼,iowait就會有很大的值了(我同時在伺服器上做了dd操作),naigos也就會發郵件告警了:
        [root@ubnginx01 ~]# /etc/nagios/libexec/check_iostat -w 6 -c 10
          IOSTAT CRITICAL - user 0.25 nice 0.00 sys 2.77 iowait 47.10 idle 0.00  | iowait=47.10%;; idle=0.00%;; user=0.25%;; nice=0.00%;; sys=2.77%;;

       完!





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-2129391/,如需轉載,請註明出處,否則將追究法律責任。

相關文章