MySQL sleep進程連接過多原因分析
當php的頁面執行結束時,會自動釋放掉一切。相信很多人都跟我想的一樣。但事實證明並不是這樣。比如session就不會隨著頁面執行完畢而釋放。
php的垃圾回收機制,其實只針對於php本身。對於mysql,php沒權利去自動去釋放它的東西。如果你在頁面執行完畢前不調用mysql_close(),那麼mysql那邊是不會關閉這個連接的。如果你是用的是pconnect方式,即使你在頁面執行完畢前調用mysql_close(),也無法另mysql關閉這個連接
mysql中睡眠連接會對mysql服務器造成影響
嚴重消耗mysql服務器資源(主要是cpu, 內存),並可能導致mysql崩潰。
造成睡眠連接過多的原因?
1. 使用了太多持久連接(個人覺得,在高並發系統中,不適合使用持久連接)
2. 程序中,沒有及時關閉mysql連接
3. 數據庫查詢不夠優化,過度耗時。
那麼,如果要從根本上解決sleep連接過多,就得從以上三點反復檢查,但是見效並不快。
在mysql的配置文件中設置自動關閉鏈接時間過長的進程:
修改mysql的配置文件my.cnf , window系統中是my.ini
[mysqld]
......
wait_timeout=100
interactive_timeout=100
wait_timeout=100 #即設置mysql連接睡眠時間為100秒,任何sleep連接睡眠時間若超過100秒,將會被mysql服務自然終止。
設置好後重啟mysql
service mysqldrestart
修改mysql占用內存的參數如下:
table_open_cache=2000 改為
table_open_cache=256
table_definition_cache=1400 改為
table_definition_cache=400