Как диагностировать Tomcat 6 вдруг перестает отвечать?
Я запускаю несколько экземпляров tomcat, а некоторые просто перестают отвечать на запросы - тайм-аут для каждого соединения.
Я использую AJP с mod_proxy в Apache 2.2.
Я получаю таймаут через Apache/AJP через коннектор Tomcat AJP, а также через прямой коннектор HTTP на 8080.
я имею /server-status
настроен в Apache и показывает 16 запросов, обрабатываемых в данный момент W
, 4 бездействующих запроса и 200+ открытых слотов без подключения. Мой разъем AJP настроен как:
<Connector port="8009" address="localhost"
maxThreads="250" minSpareThreads="5" maxSpareThreads="15"
connectionTimeout="1000"
packetSize="16384"
maxHttpHeaderSize="16384"
enableLookups="false" redirectPort="8443"
emptySessionPath="true" URIEncoding="UTF-8" protocol="AJP/1.3"/>
поэтому он должен иметь множество потоков для принятия новых соединений.
С помощью top
Я вижу процессор и жду как под 1%, так и процесс Java имеет 80% памяти. Существует 60 млн. Бесплатных мемов и 200 млн. Бесплатных свопов.
Я создал специальный threads.jsp
использование страницы
SystemThreadList stl = new SystemThreadList();
Thread[] allThreads = stl.getAllThreads();
который дает полезную информацию, но в этом состоянии - он тоже не загружается.
В catalina.log я вижу:
Mar 07, 2014 11:53:09 AM org.apache.jk.common.ChannelSocket processConnection
WARNING: processCallbacks status 2
и случайные действия из других веб-запросов, но не мои.
Есть ли способ из командной строки или с помощью профилировщика, чтобы получить список потоков и трассировки стека, чтобы выяснить, что застревает?
2 ответа
Настройте Tomcat для включения RMI с этими параметрами:
-Dcom.sun.management.jmxremote.port=12346
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=myhost
(Это пример, а не заявление о наилучшей практике для безопасности...)
Используйте jconsole, который находится в JDK, и подключитесь к вашему серверу.
Если Tomcat также не отвечает через прямой HTTP-коннектор, то проблема не в AJP, а в Tomcat что-то не так.
Вы можете получить полный дамп потока для записи в catalina.out, отправив
kill -quit <tomcat PID>