標籤:三次 用戶端程式 proc tail 協議 row close ror lis
MySQL中查詢當前的串連數:
mysql> show status like ‘%Threads_connected%‘;+-------------------+-------+| Variable_name | Value |+-------------------+-------+| Threads_connected | 27 | +-------------------+-------+1 row in set (0.00 sec)
查詢最大串連數:
show variables like ‘%max_connections%‘;set GLOBAL max_connections=800;flush privileges也可以修改/etc/my.cnf中的max_connections:max_connections = 1000
在mysql用戶端下執行show processlist可以看到很多sleep的進程,這些進程就是人們常說的死串連,它們會一直保持sleep,直到my.cnf裡面設定的wait_timeout這個參數值的時間到了,mysql才會自己殺死它。在殺死它的時候,mysql還會在error-log裡面記錄一條Aborted connection xxx to db: ‘xxx‘ user: ‘xxx‘ host: ‘xxx‘的日誌,用google翻譯一下,會得到一個相當強悍的解釋"胎死腹中的串連"!
可以通過如下命令查看系統設定的逾時時間:
show global variables like ‘%timeout‘;set global wait_timeout = 10;
那麼造成sleep的原因,有三個,下面是mysql手冊給出的解釋:
- 用戶端程式在退出之前沒有調用mysql_close()。(寫程式的疏忽,或者資料庫的db類庫沒有自動關閉每次的串連)
- 用戶端sleep的時間在wait_timeout或interactive_timeout規定的秒內沒有發出任何請求到伺服器. (類似常連,類似於不完整的tcp ip協議構造,服務端一直認為用戶端仍然存在(有可能用戶端已經斷掉了))
- 用戶端程式在結束之前向伺服器發送了請求還沒得到返回結果就結束掉了. (參看:tcp ip協議的三向交握)
配置MySQL裡的參數。逾時時間設定。
允許的同時客戶的數量。負載過大時,你將經常看到 too many connections 錯誤。已達到最大連結數,所以會出現這種情況。
伺服器在關閉串連之前在一個串連上等待行動的秒數,預設數值是28800,即如果沒有事情發生,伺服器在 8個小時後關閉串連。防止sleep過多而導致出現too many connections。
如果你的sleep進程數在同一時間內過多,再加上其他狀態的串連,總數超過了max_connection的值,那mysql除了root使用者外,就無法再繼續處理任何請求無法與任何請求建立串連或者直接down了。所以,這個問題在大負載的情況下還是相當嚴重的。如果發現你的mysql有很多死串連存在,首先要先檢查你的程式是否使用的是pconnect的方式,其次,檢查在頁面執行完畢前是否及時調用了mysql_close()。
還有一個辦法,你可以在my.cnf裡面加上wait_timeout和interactive_timeout,把他們的值設的小一些,預設情況下wait_timeout的值是8小時的時間,你可以改成1個小時,或半個小時。這樣mysql會更快的殺死死串連。防止串連總數超過max_connection的值。或者把max_connection的值設定的更大,不過這樣顯然不妥,串連的數量越多,對你伺服器的壓力越大。實際上那些串連都是冗餘的,把它們儘快殺死才是上策。
wait_timeout過大有弊端,其體現就是MySQL裡大量的sleep進程無法及時釋放,拖累系統效能,不過也不能把這個指設定的過小,否則你可能會遭遇到“MySQL has gone away”之類的問題,通常來說,我覺得把wait_timeout設定為10是個不錯的選擇,但某些情況下可能也會出問題,比如說有一個CRON指令碼,其中兩次SQL查詢的間隔時間大於10秒的話,那麼這個設定就有問題了(當然,這也不是不能解決的問題,你可以在程式裡時不時mysql_ping一下,以便伺服器知道你還活著,重新計算wait_timeout時間).
參見:http://www.blogjava.net/xiaomage234/archive/2010/04/12/318046.html
http://blog.csdn.net/starnight_cbj/article/details/4492555
MySQL Sleep進程