2010-10-29 55 views
9

我注射壓力測試到我的web應用程序連接到MySQL服務器,我的MySQL監控的SHOW PROCESSLIST。Mysql顯示進程列表列出很多進程sleep和info = null?

當負載高(高交換I/O)我得到很多的過程就像:

| 97535 | db| localhost | userA | Sleep | 515 |   | NULL 
| 97536 | db| localhost | userA | Sleep | 516 |   | NULL 
| 97786 | db| localhost | userA | Sleep | 343 |   | NULL 
| 97889 | db| localhost | userA | Sleep | 310 |   | NULL 

但我不明白爲什麼他們仍然存在,沒有被殺死?這最終導致使用所有的max_connections並停止處理傳入的請求我的應用程序...

任何想法是那些流程,以及他們在那裏做:)?

回答

12

那些正在舉行由客戶端空閒連接。您應該確保您使用的任何客戶端庫(JDBC,...)都被配置爲不會將未使用的連接保持打開狀態很長時間,或者您的#clients * max連接數不會太大。

+0

是否有任何MySQL的超時變量,我可以調整,以避免這種情況? – AlfaTeK 2010-10-29 16:52:09

+4

您可以設置WAIT_TIMEOUT的東西更小(http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout)或提高連接限制。然而,你真的想在應用程序方面解決這個問題。掛起數據庫端的連接可能會導致關閉連接的風險,就像應用程序嘗試使用它一樣,可能會導致應用程序錯誤。你使用的是什麼數據庫連接庫? – 2010-10-29 18:24:23

+0

@KeithRandall但是如何識別Null進程? – Khuram 2012-08-06 09:16:30

3

我的猜測是,你正在使用的持久連接,例如pconnect in php:

[..]連接時,函數首先會嘗試找到已經用相同的主機,用戶名和密碼打開的(永久)鏈接。如果找到一個,因爲它的標識符將被返回,而不是打開一個新的連接

[..]到SQL服務器的連接不會被關閉時的執行腳本結束。相反,鏈接將繼續開放以備將來使用

我也有類似的情況,並使用與笨打開pco​​nnect上。關閉後(see how),每個連接在使用後都正確關閉,我的MySQL進程列表爲空。

性能:以上不討論性能,只是試圖解釋爲什麼你可能會看到很多睡眠連接在MySQL中。就性能而言,這可能並不是消極的,因爲這種關係能夠保持活躍。 更多信息在:http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/