Я развернул популярный эталонный тест веб-приложений под названием 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"/>
@MarkThomas Я добавил детали.
Почти. Используете ли вы нативную библиотеку Tomcat? AJP/1.3 будет автоматически переключаться между BIO и APR/native в зависимости от наличия этой библиотеки.
@MarkThomas org.apache.coyote.ajp.AjpProtocol используется. Это БИО. (Проверено через JMX)




AJP по умолчанию использует поддерживающие соединения. Соединения BIO имеют поток, выделенный им при открытии, и этот поток остается выделенным, пока соединение не закроется.
Использование соединений keep-alive означает, что соединение никогда не закрывается, поэтому поток никогда не возвращается в пул, поэтому Executor никогда не видит завершенную задачу. Если вы отбрасываете один из экземпляров httpd, который должен закрыть открытые соединения, и вы должны увидеть, что счетчик выполненных задач на исполнителе растет, но только на количество соединений, а не на количество обработанных запросов, поскольку каждое соединение обрабатывает много запросов.
Томкэт версия? Реализация коннектора (BIO, NIO, NIO2 или APR/собственный)?