公司日本租用了阿里雲機器 本身有網絡延遲,有一臺Linux服務器專門用來跑遊戲服務,由於歷史原因,加上玩家數量的劇增,導致經常出現大量的sleep進程;
沾上一個腳本用來殺掉sleep進程:
while : do n=`mysql -uroot -pfuckdba processlist | grep -i sleep | wc -l` date=`date +%Y%m%d\[%H:%M:%S]` echo $n if [ "$n" -gt 10 ] then for i in `mysqladmin -uroot -pfuckdba processlist | grep -i sleep | awk '{print $2}'` do mysqladmin -uroot -pfuckdba kill $i done echo "sleep is too many i killed it" >> /root/tmp/sleep.log echo "$date : $n" >> /root/tmp/sleep.log fi sleep 120 #每隔120 秒 執行一次 done
MySQL服務器所支持的最大連接數是有上限的,因爲每個連接的建立都會消耗內存,因此我們希望客戶端在連接到MySQL Server處理完相應的操作後,應該斷開連接並釋放佔用的內存。如果你的MySQL Server有大量的閒置連接,他們不僅會白白消耗內存,而且如果連接一直在累加而不斷開,最終肯定會達到MySQL Server的連接上限數,這會報'too many connections'的錯誤。對於wait_timeout的值設定,應該根據系統的運行情況來判斷。在系統運行一段時間後,可以通過show processlist命令查看當前系統的連接狀態,如果發現有大量的sleep狀態的連接進程,則說明該參數設置的過大,可以進行適當的調整小些。
經查詢發現原來mysql沒有進行過優化,還是原來的默認值:28800(即8個小時)
編輯 /etc/my.cnf,在mysqld 下 新增 timeout參數,設置爲120秒,如下:
【mysqld】
wait_timeout=120
interactive_timeout=120
注意:要同時設置interactive_timeout和wait_timeout纔會生效。
經過測試服測試完全沒問題,重啓一下mysql 生效 即可!當然線上的就比較坑了,由於服務器第一天租到,第二天就開始上線沒來得及優化,很多臺裏面只有一條,執行命令比較慢,就等着下次替換文件重啓了。