Как я могу отслеживать/регистрировать пул потоков Tomcat?

У меня есть установка Tomcat, где я подозреваю, что пул потоков может уменьшаться с течением времени из-за того, что потоки не освобождаются должным образом. Я получаю сообщение об ошибке в catalina.out при достижении maxthreads, но я хотел бы регистрировать количество используемых потоков в файле каждые пять минут, чтобы проверить эту гипотезу. Кто-нибудь может подсказать, как это можно сделать?

Также в этой установке нет менеджера Tomcat, похоже, что тот, кто выполнил исходную установку, по какой-то причине удалил веб-приложение менеджера. Я не уверен, сможет ли менеджер сделать вышеперечисленное или я смогу переустановить его, не повредив существующую установку? Все, что я действительно хочу сделать, это отслеживать пул потоков.

Кроме того, я заметил, что maxthreads для Tomcat составляет 200, но максимальное количество одновременных подключений для Apache ниже (Apache использует mod_proxy и mod_proxy_ajp (AJP 1.3) для подачи Tomcat). Это тоже кажется неправильным, каково правильное соотношение между этими числами?

Любая помощь очень ценится: D

Обновление: просто быстрое обновление, чтобы сказать, что прямой доступ к JMX работал. Однако мне также пришлось установить Dcom.sun.management.jmxremote.host. Я установил его на локальный хост, и это сработало, но без него никак. Если у кого-то еще есть аналогичная проблема при попытке включить JMX, я рекомендую вам также установить это значение, даже если вы подключаетесь с локального компьютера. Кажется, это требуется для некоторых версий Tomcat.


Просто быстрое обновление, чтобы сказать, что прямой доступ к JMX работал. Однако мне также пришлось установить Dcom.sun.management.jmxremote.host. Я установил его на локальный хост, и это сработало, но без него никак. Если у кого-то еще есть аналогичная проблема при попытке включить JMX, я рекомендую вам также установить это значение, даже если вы подключаетесь с локального компьютера. Кажется, это требуется для некоторых версий Tomcat.


person Alex P    schedule 07.09.2011    source источник
comment
Если вы работаете на Java 5+, вы можете отслеживать пул потоков JVM с помощью jconsole.   -  person Thomas    schedule 07.09.2011
comment
Я попытался подключиться к Tomcat с помощью jconsole, но это не удалось (это попытка подключения с использованием PID Tomcat на локальном хосте, а не удаленно). Нужно ли включать JMX для использования jconsole?   -  person Alex P    schedule 07.09.2011
comment
Насколько я знаю, в Java 5 вам нужно включить JMX. Начиная с Java 6 в этом нет необходимости для локального доступа. В качестве альтернативы есть опция Hotspot JVM, которая создает дамп потока из командной строки (IIRC это -XX:+HeapDumpOnCrtlBreak, который создаст дамп кучи и дамп потока)   -  person Thomas    schedule 07.09.2011
comment
Можете ли вы показать сообщение об ошибке, которое выдает tomcat? Параметр максимального количества потоков tomcat относится к количеству соединителей, которые он может использовать, что, по сути, является количеством одновременных подключений, которые он может обрабатывать... поэтому два числа, которые вы упомянули, должны быть похожими. По крайней мере, это мое понимание   -  person Toby    schedule 07.09.2011
comment
Ошибка СЕРЬЕЗНАЯ: Все потоки (200) в настоящее время заняты, ожидая. Увеличьте максимальное количество потоков или проверьте статус сервлета. Кроме того, когда это происходит, Tomcat перестает обслуживать страницы и выдает 503. Я думаю, что эти два числа должны быть одинаковыми, т.е. MaxClients в Apache - это максимальное количество одновременных подключений, так что не должно ли это также быть 200?   -  person Alex P    schedule 07.09.2011


Ответы (3)


Прямой доступ к JMX

Попробуйте добавить это к catalina.sh/bat:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=5005
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

ОБНОВЛЕНИЕ: Alex P предполагает, что в некоторых ситуациях также могут потребоваться следующие настройки:

-Dcom.sun.management.jmxremote.host=localhost

Это разрешает удаленные анонимные соединения JMX через порт 5005. Вы также можете рассмотреть JVisualVM, который намного удобнее и позволяет просматривать JMX через плагин.

То, что вы ищете, это Catalina -> ThreadPool -> http-bio-8080 -> различные интересные метрики.

Прокси-сервлет JMX

Более простым способом может быть использование прокси-сервера JMX Tomcat в разделе: http://localhost:8080/manager/jmxproxy. Например, попробуйте этот запрос:

$ curl --user tomcat:tomcat http://localhost:8080/manager/jmxproxy?qry=Catalina:name=%22http-bio-8080%22,type=ThreadPool

Немного grepping и сценариев, и вы сможете легко и удаленно контролировать свое приложение. Обратите внимание, что tomcat:tomcat — это имя пользователя/пароль пользователя с ролью manager-jmx в conf/tomcat-users.xml.

person Tomasz Nurkiewicz    schedule 07.09.2011
comment
Спасибо, Томаш, я попробую. Я не думаю, что смогу использовать прокси-сервлет, поскольку он находится под менеджером, который, к сожалению, по какой-то причине, кажется, был удален из установки - каталог администратора существует, но менеджера нет. - person Alex P; 07.09.2011
comment
Я пытался использовать curl/jmxproxy, как указано выше, но он просто дал 404, поэтому я думаю, что менеджер не работает, я попытаюсь включить JMX на явном порту, как было предложено выше, посмотреть, работает ли это. Спасибо всем за помощь! - person Alex P; 07.09.2011

Вы можете развернуть jolokia.war, а затем получить значения mbeans в формате JSON (без менеджера):

http://localhost:8080/jolokia/read/Catalina:name=%22http-nio-8080%22,type=ThreadPool?ignoreErrors=true

Если вам нужны только некоторые значения (currentThreadsBusy, maxThreads, currentThreadCount, connectionCount):

http://localhost:8080/jolokia/read/Catalina:name=%22http-nio-8080%22,type=ThreadPool/currentThreadsBusy,maxThreads,currentThreadCount,connectionCount?ignoreErrors=true

{
    request: {
       mbean: "Catalina:name="http-nio-8080",type=ThreadPool",
       attribute: [
          "currentThreadsBusy",
          "maxThreads",
          "currentThreadCount",
          "connectionCount"
       ],
       type: "read"
    },
    value: {
       currentThreadsBusy: 1,
       connectionCount: 4,
       currentThreadCount: 10,
       maxThreads: 200
    },
    timestamp: 1490396960,
    status: 200
}

Примечание. Этот пример работает на Tomcat7+.

person c-toesca    schedule 24.03.2017
comment
Вы можете не ссылаться на http-nio-8080 или http-bio-8080, используя подстановочный знак, который приведет ко всем пулам потоков: curl -XGET 'http://localhost:8080/jolokia/read/Catalina:name=*,type=ThreadPool?ignoreErrors=true' - person Gabriel Belingueres; 10.01.2018

Для более корпоративного решения. Я использую New Relic в нашей производственной среде.

Это обеспечивает график изменений в пуле потоков с течением времени.

person Tinman    schedule 12.07.2013
comment
Отличный инструмент. Жаль, что цены сумасшедшие - person Tommy; 24.09.2015