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,優化之