2009-05-02 153 views
1

我們有一個相當繁忙的網站(每天100萬次頁面瀏覽量)使用Apache mod代理,在TIME_WAIT狀態下連接(> 1,000)不斷超載。連接到端口3306(mysql),但mysql只顯示幾個連接(顯示進程列表),並表現良好。 我們嘗試改變一堆東西(保持活躍/關閉),但似乎沒有任何幫助。所有其他系統資源都在合理範圍內。太多的TIME_WAIT連接

我搜索了四周,這似乎表明更改tcp_time_wait_interval。但那似乎有點激烈。我以前在繁忙的網站上工作過,但從未遇到過這個問題。

有什麼建議嗎?

回答

0

我們有類似的問題,我們的網絡服務器都凍結了,因爲我們的php連接到一個mysql服務器,該服務器被設置爲對傳入連接執行反向主機查找。

當事情進展緩慢時,它可以正常工作,但是在負載下,responstimes通過屋頂拍攝,所有apache服務器都卡在time_wait中。

我們通過使用xdebug在高負載下創建腳本的性能分析數據並查看問題的方式。 mysql_connect調用佔用了80-90%的執行時間。

+0

但是,連接是否都來自同一臺服務器,您的Web服務器或您的應用程序服務器?我會認爲在第一次連接之後,mysql會觸發主機緩存。他們做了 – 2009-05-02 00:55:49

+0

,但事實並非如此。 – xkcd150 2009-05-02 01:12:01

5

每個time_wait連接是一個已關閉的連接。

您可能連接到mysql,發出查詢,然後斷開連接。對頁面上的每個查詢重複。考慮使用連接池工具,或者至少使用一個保存在數據庫連接上的全局變量。如果您使用全局,則必須在頁面末尾關閉連接。希望你有一些常見的東西可以放在那裏,就像一個頁腳包含。

作爲獎勵,你應該得到更快的頁面加載。 MySQL很快連接,但不需要重新連接更快。

+0

我們使用的是PHP,所以您無法真正做連接池,因爲一旦頁面交付,流程結束。 – 2009-05-02 02:18:09

+0

通過將db連接分配給全局變量,您仍然可以在頁面內重用連接。而不是每次重新創建。你也可以使用類似http://httpd.apache.org/docs/2.2/mod/mod_dbd.html的方法在php進程之外進行池化。 – Trey 2009-05-02 16:45:41

+0

@trey @craig任何php演示如何創建全局變量 – 2011-03-15 12:03:27