Поведение пула потоков Tomcat в Apache + Tomcat Deployement - PullRequest
0 голосов
/ 02 мая 2019

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

Вот мой вопрос. Атрибут completedTaskCount разделяемого исполнителя Tomcat MBean не обновляется в соответствии с количеством обслуживаемых запросов (фактически он остается неизменным на уровне 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"/>

1 Ответ

1 голос
/ 07 мая 2019

AJP по умолчанию использует keep-alive соединения. Соединениям BIO назначается поток, когда они открываются, и этот поток остается выделенным до закрытия соединения.

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

...