Tomcat прекращает отвечать на запросы JK

У меня есть противная проблема со сбалансированными с загрузки серверами Tomcat, которые зависают. Любая справка значительно ценилась бы.

Система

Я выполняю Tomcat 6.0.26 на Сервере HotSpot, 14.3-b01 (Java 1.6.0_17-b04) на трех серверах, находящихся позади другого сервера, который действует как подсистема балансировки нагрузки. Подсистема балансировки нагрузки выполняет Apache (2.2.8-1) + MOD_JK (1.2.25). Все серверы запускают Ubuntu 8.04.

Tomcat имеет 2 настроенные коннектора: AJP один, и HTTP один. AJP должен использоваться с подсистемой балансировки нагрузки, в то время как HTTP используется командой разработчиков для прямого соединения с выбранным сервером (если у нас есть причина сделать так).

У меня есть Лямбда-зонд 1.7b установленный на серверах Tomcat, чтобы помочь мне диагностировать и решить проблему скоро, чтобы быть описанным.

Проблема

Вот проблема: приблизительно после 1 дня возросли серверы приложений, менеджер по Состоянию JK начинает сообщать о состоянии ERR для, скажем, Tomcat2. Это просто застрянет на этом состоянии, и единственная фиксация, которую я нашел до сих пор, является к ssh Tomcat перезапуска и полем.

Я должен также упомянуть, что менеджер по Состоянию JK берет намного дольше для обновления, когда существует сервер Tomcat в этом состоянии.

Наконец, "Занятое" количество застрявшего Tomcat на менеджере по Состоянию JK всегда высоко, и не понизится по сути - я должен перезапустить сервер Tomcat, ожидать, затем сбросить рабочего на JK.

Анализ

Так как у меня есть 2 коннектора на каждом Tomcat (AJP и HTTP), я все еще могу соединиться с приложением через HTTP один. Приложение работает просто великолепно как это, очень, очень быстро. Это совершенно нормально, так как я - единственный с помощью этого сервера (поскольку JK прекратил делегировать запросы к этому Tomcat).

Чтобы попытаться лучше понять проблему, я взял дамп потока от Tomcat, который не отвечает больше, и от другого, который был недавно перезапущен (скажите, за 1 час до этого).

Экземпляр, который отвечает обычно на JK, показывает большинство потоков TP-ProcessorXXX в "Выполнимом" состоянии со следующим отслеживанием стека:

java.net.SocketInputStream.socketRead0 ( native code )
java.net.SocketInputStream.read ( SocketInputStream.java:129 )
java.io.BufferedInputStream.fill ( BufferedInputStream.java:218 )
java.io.BufferedInputStream.read1 ( BufferedInputStream.java:258 )
java.io.BufferedInputStream.read ( BufferedInputStream.java:317 )
org.apache.jk.common.ChannelSocket.read ( ChannelSocket.java:621 )
org.apache.jk.common.ChannelSocket.receive ( ChannelSocket.java:559 )
org.apache.jk.common.ChannelSocket.processConnection ( ChannelSocket.java:686 )
org.apache.jk.common.ChannelSocket$SocketConnection.runIt ( ChannelSocket.java:891 )
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run ( ThreadPool.java:690 )
java.lang.Thread.run ( Thread.java:619 )

Экземпляр, который застревает, показывает большинство (все?) TP-ProcessorXXX распараллеливает в состоянии "Ожидания". Они имеют следующее отслеживание стека:

java.lang.Object.wait ( native code )
java.lang.Object.wait ( Object.java:485 )
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run ( ThreadPool.java:662 )
java.lang.Thread.run ( Thread.java:619 ) 

Я не знаю о внутренностях Tomcat, но я вывел бы, что потоки "Ожидания" являются просто потоками, находящимися на пуле потоков. Так, если бы они - потоки, ожидая в пуле потоков, почему Tomcat не поместил бы их для работы над обработкой запросов от JK?

Править: Я не знаю, нормально ли это, но Лямбда-зонд показывает мне в разделе Status, что существует много потоков в KeepAlive состояние. Это так или иначе связано с проблемой, которую я испытываю?

Решение?

Так, как я заявил прежде, единственная фиксация, которую я нашел, должна остановить экземпляр Tomcat, остановить рабочего JK, ожидать, занятое количество последнего медленно понижается, запускает Tomcat снова и включает рабочему JK еще раз.

Что вызывает эту проблему? Как я должен далее исследовать его? Что я могу сделать для решения его?

Заранее спасибо.

10
задан Bruno Reis 17 May 2010 в 19:33
поделиться

4 ответа

Сначала проверьте файл журнала.

Я думаю, что файл журнала по умолчанию находится в /var/log/daemon.log. (этот файл содержит не только журналы Tomcat)

1
ответ дан 4 December 2019 в 02:49
поделиться

Проверьте настройку времени поддержки активности. Кажется, вы переводите потоки в состояние поддержки активности, и у них нет времени ожидания. Похоже, ваш сервер не обнаруживает отключения клиентов в разумные сроки. Есть несколько переменных тайм-аута и подсчета.

2
ответ дан 4 December 2019 в 02:49
поделиться

Настроены ли у вас параметры памяти JVM и сборка мусора? Вы бы сделали это там, где вы устанавливаете CATALINA_OPTS

примеры:

CATALINA_OPTS="$CATALINA_OPTS -server -Xnoclassgc -Djava.awt.headless=true"
CATALINA_OPTS="$CATALINA_OPTS -Xms1024M -Xmx5120M -XX:MaxPermSize=256m"
CATALINA_OPTS="$CATALINA_OPTS -XX:-UseParallelGC"
CATALINA_OPTS="$CATALINA_OPTS -Xnoclassgc"

Существует множество философий о том, какая настройка GC лучше. Это зависит от типа кода, который вы выполняете. Конфигурация выше работала лучше всего для среды с интенсивным использованием JSP (taglibs вместо MVC framework).

3
ответ дан 4 December 2019 в 02:49
поделиться

У меня была аналогичная проблема с Weblogic. Причина заключалась в том, что слишком много потоков ожидали сетевых ответов, а Weblogic не хватало памяти. Tomcat, вероятно, ведет себя так же. Вот что вы можете попробовать:

  • Уменьшите значение тайм-аута ваших подключений.
  • Уменьшите общее количество одновременных подключений, чтобы tomcat не запускал новые потоки при достижении этого количества.
  • Простое исправление, но не устраняет основную причину: возможно, tomcat находится в состоянии нехватки памяти, даже если он еще не отображается в журналах. Увеличьте память кота, как описано ранее.
1
ответ дан 4 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: