2011-09-18 42 views
1

我們最近開始看到我們的tomcat服務器的線程數量出現峯值(峯值通常在100左右時超過1000)。我們在其中一個tomcat服務器上執行了線程轉儲,同時它的線程數很高,並且發現大量線程正在等待MultiThreadedHttpConnectionManager $ ConnectionPool,堆棧跟蹤如下:由等待線程導致的高線程數tomcat線程池MultiThreadedHttpConnectionManager ConnectionPool

「TP-Processor21700」守護進程prio = 10 TID = 0x4a0b3400 NID = 0x2091中的Object.wait()[0x399f3000..0x399f4004] java.lang.Thread.State中:WAITING(對象監視器上) 在java.lang.Object.wait(本機方法) - 等待在< 0x58ee5030>(a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager $ ConnectionPool) at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.doGetConnection(MultiThreadedHttpConnectionManager.java:518) - locked < 0x58ee5030>(一個org.apache.commons.httpclient.MultiThreadedHttpConnectionManager $連接池) 在org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.getConnectionWithTimeout(MultiThreadedHttpConnectionManager.java:416) 在org.apache.commons.httpclient.HttpMethodDirector.executeMethod (HttpMethodDirector.java:153) 在org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) 在org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323) ..

在我們的代碼中有3個點,其中調用了httpClient.executeMethod()(通過對另一個tomcat服務器的http請求獲取信息)。在每種情況下,傳遞給它的GetMethod對象的套接字超時值都已設置(即通過getMethod.getParams()。setSoTimeout();),而MultiThreadedConnectionManager在spring中配置爲具有10秒的connectionTimeout值。我注意到的一件事是,3個httpClient.executeMethod()調用中只有2個調用getMethod.releaseConnection(),所以我想知道這是否可能是問題的原因(即連接不明確發佈)。然而奇怪的是,這個問題只是在最近幾天纔開始發生的,並且源代碼在一年內還沒有被修改,再加上最近沒有通過tomcat服務器的請求激增。在問題發生之前幾天發生的一個變化是,我們將tomcat服務器使用的JVM從Java 5(1.5更新14)升級到Java 6(1.6更新25)。我們已經嘗試了暫時將JVM版本恢復到Java 5,以查看問題是否停止發生,但沒有發生。另一點需要注意的是,在大多數情況下,tomcat服務器最終會恢復並且線程數會恢復正常 - 我們只有一個tomcat進程由於線程數增加而崩潰的實例。

我們正在運行Tomcat 5.5,使用commons-httpclient-3.1.jar在Red Hat Linux環境中針對Java 1.6更新25運行。

請讓我知道,如果你能提出任何想法,可能是這個問題的原因。

謝謝。

回答

2

問題確實是由於3個httpClient.executeMethod(getMethod)調用中只有2個調用getMethod.releaseConnection()後引起的。確保所有3個httpClient.executeMethod(getMethod)調用位於try/catch塊內,後跟一個包含對getMethod.releaseConnection()的調用的finally塊,以防止發生高線程計數。雖然這段代碼在我們的實時系統中已經使用了一年多,但似乎最近纔開始出現高線程數問題的原因是因爲各種搜索引擎爬蟲已經開始用大量的URL請求來觸發該網站,導致代碼在連接正在使用中,但隨後不會執行。問題解決了。