15. 監控磁碟IO使用率

最愛喝酸奶發表於2019-02-03

計算機有三大件:CPU、記憶體和磁碟,這三者中往往是磁碟會“拖後腿”。在生產環境,作為資料庫角色的伺服器磁碟建議拿4塊硬碟做磁碟陣列RAID10,這樣既保證資料讀寫速度也保證資料的安全。

本案例要求寫一個監控磁碟IO使用率的指令碼,實時檢視IO使用情況,防止因為磁碟IO效率低而導致MySQL查詢慢的問題。

具體要求如下:

1)磁碟IO使用超過90就記錄日誌並郵件告警;

2)假設記錄日誌的目錄是 /data/iolog/ ;

3)找出導致磁碟IO使用率過高的程式。

郵件指令碼如下:

#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mine.text import MIMEText
import sys
mail_host = 'stmp.163.com'
mail_user = 'test@163.com'
mail_pass = 'your_mail_password'
mail_postfix = '163.com'
def send_mail(to_list,subject,content):
    me = "zabbix 監控告警平臺"+"<"+mail_user+"@"+mail_postfix+">"
    msg = MIMEText(content,'plain','utf-8')
    msg['Subject'] = subject
    msg['From'] = me
    msg['to'] = to_list
    try:
        s = smtplib:SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me,to_list,msg.as_string())
        s.close()
        return True
    except Exception,e:
        print str(e)
        return False
if __name__ == "__main__"
    send_mail(sys.argv[1], sys.argv[2], sys.argv[3])

參考指令碼如下:

#!/bin/bash
#監控磁碟IO使用率並告警

#定義收件人郵箱
mail="/usr/local/sbin/mail.py"
mail_user=admin@admin.com

if ! which iostat &>/dev/null
then
    yum install -y sysstat
fi

if ! which iotop &>/dev/null
then
    yum install -y iotop
fi

logdir=/data/iolog

dt=`date +%F`           #以日期作為日誌名字

#獲取IO,取5次平均值
get_io()
{
    iostat -dx 1 5 > $logdir/iostat.log
    sum=0
    
    for ut in `grep "^$1" $logdir/iostat.log |awk '{print $NF}' |cut -d '.' -f 1`
    do
        sum=$[$sum+$ut]
    done
    echo $[$sum/5]
}

while ture
do
    for d in `iostat -dx |egrep -v '^$|Device:|CPU\}' |awk '{print $1}'
    do
        io=`get_io $d`
        
        if [ $io -gt 90 ]
        then
            date >> $logdir/$dt
            cat $logdir/iostat.log >> $logdir/$dt
            iotop -obn2 >> $logdir/$dt
            echo "###################" >> $logdir/$dt
            
            python $mail $mail_user "磁碟IO使用率超過90%" "`cat $logdir/$dt`" 2>/dev/null
        fi
    done
    sleep 10
done

相關文章