Apache + Tomcat部署中Tomcat线程池的行为

时间:2019-05-02 17:58:22

标签: java multithreading apache tomcat threadpool

我已经在3层环境中部署了流行的Web应用程序基准测试,称为TPC-W。我有两个物理节点,一个运行Apache Web Server,另一个运行Tomcat + MySQL。我在Tomcat中使用共享的执行程序,并且试图了解它的行为。我正在使用JMX监视Tomcat JVM。

这是我的问题。 Tomcat共享执行器MBean的completedTaskCount属性不会根据服务的请求数进行更新(实际上,它保持不变为0)。我可以看到,GlobalRequestProcessor MBean中的AJP连接器下有很多请求。这是为什么?处理请求时,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 个答案:

答案 0 :(得分:1)

AJP默认情况下使用保持活动连接。当BIO连接打开时,BIO连接将分配一个线程,并且该线程将保持分配状态直到连接关闭。

使用保持活动连接意味着连接永远不会关闭,因此线程永远不会返回到池,因此执行程序永远不会看到完成的任务。如果您跳出应该关闭打开的连接的httpd实例之一,并且应该看到执行器上的已完成任务数增加了-但仅按连接数而不是已处理请求数进行,因为每个连接都处理许多请求。