Apache + Tomcat 部署中 Tomcat 线程池的行为
Posted
技术标签:
【中文标题】Apache + Tomcat 部署中 Tomcat 线程池的行为【英文标题】:Behavior of Tomcat Thread Pool in Apache + Tomcat Deployement 【发布时间】:2019-09-21 07:04:54 【问题描述】:我在 3 层设置中部署了一个名为 TPC-W 的流行 Web 应用程序基准测试。我有两个物理节点,一个运行 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"/>
【问题讨论】:
Tomcat 版本?连接器实现(BIO、NIO、NIO2 或 APR/native)? @MarkThomas 我已经添加了详细信息。 差不多。你在使用 Tomcat Native 库吗? AJP/1.3 将根据该库是否存在自动在 BIO 和 APR/native 之间切换。 @MarkThomas org.apache.coyote.ajp.AjpProtocol 被使用。那是生物。 (通过 JMX 检查) 【参考方案1】:AJP 默认使用保持连接。 BIO 连接在打开时分配给它们一个线程,并且该线程保持分配状态直到连接关闭。
keep-alive 连接的使用意味着连接永远不会关闭,因此线程永远不会返回池,因此 Executor 永远不会看到已完成的任务。如果您退回应该关闭打开的连接的 httpd 实例之一,并且您应该看到执行程序上已完成的任务计数增加 - 但仅取决于连接数,而不是处理的请求数,因为每个连接处理许多请求。
【讨论】:
以上是关于Apache + Tomcat 部署中 Tomcat 线程池的行为的主要内容,如果未能解决你的问题,请参考以下文章