以前我們的Web服務器中多次出現Apache負載過高引起機器死機或者很長時間才能恢複正常的情況,後來在網上找了一個自動監控Linux系統Average Load的程序,當這個值大于設定值的時候,會自動重啟Apache,我們在Crontab中設置的是每2分鐘執行這個.sh腳本,并進行情況記錄,使用中覺得還是很有用的。
而MySQL超時的問題以前比較罕見,但最近因為數據量越來越大,也常發現在PROCESSLIST中看到超過數百、數千甚至上萬秒的進程,這個時候機器的負載極高,網站無法訪問。
老是人工守着查看超時進程并Kill不是一個可行的辦法,在網上找到下面一個Linux Shell腳本:
DB_HOST="localhost" DB_PORT=3306 DB_USER="root" DB_PASS="" maxtime=300 sql="SHOW PROCESSLIST" sss=$(/usr/bin/mysqladmin processlist-p -h$DB_HOST $DB_PASS|sed -e "s/\s//g"|awk -F'|' '{print $2,$7,substr($9,1,6)}'|awk '{if($2>'"$maxtime"' && $3=="SELECT"){print $1}}') for pid in $(echo "$sss"); do /usr/bin/mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS -e "kill $pid" done echo "$sss" date
保存為checkmysql.sh,試運行了一下,應該是有用的,于是在crontab中設置:
*/3 * * * * root /root/checkmysql.sh >>/root/checkmysql.log
也就是每3分鐘運行一次這個腳本,對于超過300秒(5分鐘)的MySQL進程強行删除終止,防止拖累整個服務器以緻所有網站。實際效果還要運行一段時間來看看checkmysql.log中的記錄。
自由标簽
评论