MySQL的Sleep進程


php的垃圾回收機制,其實只針對於php本身。

對於mysql,php沒權利去自動去釋放它的東西。

如果你在頁面執行完畢前不調用mysql_close(),那么mysql那邊是不會關閉這個連接的。

如果你是用的是pconnect方式,即使你在頁面執行完畢前調用mysql_close(),也無法另mysql關閉這個連接。

在php中使用pconnect方式建立連接,如果你的負載到一定程度的話,可以看到很多sleep的進程,這些進程就是所謂死連接,它們會一直保持sleep,直到my.cnf里面設置的wait_timeout這個參數值的時間到了,mysql才會自己殺死它。

在殺死它的時候,mysql還會在error-log里面記錄一條Aborted connection xxx to db: 'xxx' user: 'xxx' host: 'xxx'的日志。

造成sleep的原因:

1 The client program did not call mysql_close() before exiting.

2 The client had been sleeping more than wait_timeout or interactive_timeout seconds without issuing any requests to the server.

3 The client program ended abruptly in the middle of a data transfer

如果你的sleep進程數在同一時間內過多,再加上其他狀態的連接,總數超過了max_connection的值,那mysql除了root用戶外,就無法再繼續處理任何請求無法與任何請求建立連接或者直接掛了

解決方式:

1.先要先檢查你的程序是否使用的是pconnect的方式,其次,檢查在頁面執行完畢前是否及時調用了mysql_close()。盡量不要使用pconnect的方式,即使用mysql_connect。程序執行完畢,應該顯式調用mysql_close

2.在my.cnf里面加上wait_timeout和interactive_timeout,把值設的小一些,默認情況下wait_timeout的值是8小時的時間,你可以改成1個小時,或半個小時。這樣mysql會更快的殺死死連接。防止連接總數超過max_connection的值。

  wait_timeout 過大,會導致MySQL里大量的SLEEP進程無法及時釋放,拖累系統性能,不過設置的過小,可能會遇到“MySQL has gone away”之類的問題

  把max_connection的值設置的更大,不過這樣顯然不妥,連接的數量越多,對你服務器的壓力越大。實際上那些連接都是冗余的,把它們盡快殺死才是上策。

3.逐步分析系統的SQL查詢,找到查詢過慢的SQL,優化之

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM