Большое число потоков tomcat, вызванное потоками, ожидающими в MultiThreadedHttpConnectionManager ConnectionPool - PullRequest
1 голос
/ 18 сентября 2011

Недавно мы начали наблюдать скачки в подсчете потоков на наших серверах 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.

Пожалуйста, дайте мне знать, если вы можете предложить какие-либо идеи относительно того, что может быть причиной этой проблемы.

Спасибо.

1 Ответ

3 голосов
/ 23 сентября 2011

Проблема действительно была вызвана тем фактом, что только за 2 из 3 вызовов httpClient.executeMethod (getMethod) последовал вызов getMethod.releaseConnection ().Обеспечение того, чтобы все 3 вызова httpClient.executeMethod (getMethod) находились внутри блока try / catch, за которым следовал блок finally, содержащий вызов getMethod.releaseConnection (), предотвращал возникновение большого числа потоков.Хотя этот код находился в нашей действующей системе более года, кажется, что причина большого количества потоков возникла только недавно, потому что различные поисковые роботы начали посещать сайт с большим количеством URL-запросов, что привело к тому, что кодсоединение использовалось, но впоследствии не было освобождено для выполнения.Проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...