Недавно мы начали наблюдать скачки в подсчете потоков на наших серверах Tomcat (пиковое значение более 1000, обычно около 100). Мы выполнили дамп потока на одном из серверов 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> (org.apache.commons.httpclient.MultiThreadedHttpConnectionManager $ ConnectionPool)
в org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.doGetConnection (MultiThreadedHttpConnectionManager.java:518)
- заблокировано <0x58ee5030> (org.apache.commons.httpclient.MultiThreadedHttpConnectionManager $ ConnectionPool)
в 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 () (для получения информации через http-запрос к другому серверу tomcat). В каждом случае переданному ему объекту GetMethod было установлено значение тайм-аута сокета (т. Е. Через getMethod.getParams (). SetSoTimeout ();), а весной MultiThreadedConnectionManager настроен так, чтобы значение connectionTimeout составляло 10 секунд. Одна вещь, которую я заметил, состоит в том, что только 2 из 3 вызовов httpClient.executeMethod () сопровождаются вызовом getMethod.releaseConnection (), поэтому мне интересно, может ли это быть причиной проблемы (то есть соединения не являются явно вышел). Однако что странно в том, что
Эта проблема начала возникать только в последние несколько дней, и исходный код не изменялся более года, плюс тот факт, что в последнее время не было никакого увеличения запросов, поступающих на серверы Tomcat. Одно изменение, которое произошло за несколько дней до того, как возникла проблема, заключалось в том, что мы обновили JVM, используемую сервером tomcat, с Java 5 (1.5 обновление 14) до Java 6 (1.6 обновление 25). Мы попытались временно вернуть версию JVM в Java 5, чтобы увидеть, перестала ли проблема возникать, но это не так. Еще один момент, на который следует обратить внимание, заключается в том, что в большинстве случаев сервер Tomcat в конечном итоге восстанавливается и
счетчик потоков возвращается к нормальному состоянию - у нас был только один случай, когда процесс tomcat завершился сбоем из-за увеличения количества потоков.
Мы запускаем Tomcat 5.5 с commons-httpclient-3.1.jar, работающим с обновлением 25 Java 1.6 в среде Red Hat linux.
Пожалуйста, дайте мне знать, если вы можете предложить какие-либо идеи относительно того, что может быть причиной этой проблемы.
Спасибо.