Поведение пула потоков Tomcat в развертывании Apache + Tomcat

Я развернул популярный эталонный тест веб-приложений под названием TPC-W в трехуровневой настройке. У меня есть два физических узла, один из которых работает с веб-сервером Apache, а другой — с Tomcat + MySQL. Я использую общий исполнитель в Tomcat и пытаюсь понять его поведение. Я использую JMX для мониторинга JVM Tomcat.

Вот мой вопрос. Атрибут completedTaskCount общего исполнителя MBean Tomcat не обновляется в зависимости от количества обслуживаемых запросов (на самом деле он остается неизменным на уровне 0). Я вижу, что через AJP-коннектор в MBean GlobalRequestProcessor обслуживается очень большое количество запросов. Почему это? Не должно completedTaskCount увеличиваться по мере обработки запросов.

Единственное возможное объяснение, к которому я пришел, состоит в том, что это связано с некоторым поведением в протоколе AJP. Я предположил, что по какой-то причине каждый процесс Apache подключается к потоку в пуле потоков исполнителя Tomcat и отправляет все входящие запросы как один запрос к Apache. Даже любой новый входящий запрос отправляется как часть этого запроса. в этом случае поток Tomcat никогда не увидит, что этот запрос от Apache полностью обслужен. Есть ли в этом смысл?

Любые указатели или помощь по этому поводу высоко ценятся.

Изменить 1

Версия Tomcat: 7.0.94

Версия Apache: 2.4.38

Это определение соединителя:

<Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" executor = "tomcatThreadPool"/>

Вот определение общего исполнителя:

<Executor name = "tomcatThreadPool" namePrefix = "tpcw-exec-" maxThreads = "200" minSpareThreads = "25"/>

Томкэт версия? Реализация коннектора (BIO, NIO, NIO2 или APR/собственный)?

Mark Thomas 03.05.2019 09:00

@MarkThomas Я добавил детали.

smb564 03.05.2019 11:19

Почти. Используете ли вы нативную библиотеку Tomcat? AJP/1.3 будет автоматически переключаться между BIO и APR/native в зависимости от наличия этой библиотеки.

Mark Thomas 04.05.2019 17:19

@MarkThomas org.apache.coyote.ajp.AjpProtocol используется. Это БИО. (Проверено через JMX)

smb564 05.05.2019 10:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
524
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

AJP по умолчанию использует поддерживающие соединения. Соединения BIO имеют поток, выделенный им при открытии, и этот поток остается выделенным, пока соединение не закроется.

Использование соединений keep-alive означает, что соединение никогда не закрывается, поэтому поток никогда не возвращается в пул, поэтому Executor никогда не видит завершенную задачу. Если вы отбрасываете один из экземпляров httpd, который должен закрыть открытые соединения, и вы должны увидеть, что счетчик выполненных задач на исполнителе растет, но только на количество соединений, а не на количество обработанных запросов, поскольку каждое соединение обрабатывает много запросов.

Другие вопросы по теме