使用 mod_proxy_ajp 时 tomcat 服务器上的僵尸连接

使用 mod_proxy_ajp 时 tomcat 服务器上的僵尸连接

我正在使用带有 apache mode_proxy_ajp 模块的 tomcat 服务器 7 来为网站提供服务。这是我的 ajp 连接器配置:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" connectionTimeout="20000"
minSpareThreads="10" maxThreads="512" executor="tomcatThreadPool_1" acceptCount="128"
acceptorThreadCount="2" maxKeepAliveRequests="50" keepAliveTimeout="10000" URIEncoding="UTF-8"/>

&这是执行器配置:

<Executor name="tomcatThreadPool_1" namePrefix="catalina-exec-" connectionTimeout="20000"
minSpareThreads="10" maxSpareThreads="50" maxThreads="512" acceptCount="128"/>

现在的问题是,很多时候我在 tomcat 管理器(服务器状态)中看到许多具有 S (服务)状态的连接,如下所示:

在此处输入图片描述

这些连接似乎打开了很长时间,但它们没有任何发送或接收,甚至没有后台代码执行和 CPU 消耗(因此我认为我的 servlet 代码没有问题),它们看起来只是一些僵尸连接,它们不会销毁,直到重新启动 tomcat 服务器(重新启动 apache 服务器甚至通过主机管理器重新启动 tomcat 虚拟主机对它们没有影响)!
我检查了所有可能的相关参数,但找不到这个问题的根源。

答案1

这些很可能mod_proxy 中的池连接。它将打开与后端服务器的连接并保持打开状态以便重复使用。您可以调整 mod_proxy(超时、ttl 等)和 Tomcat(connectionTimeout)的设置,也可以disablereuse在 mod_proxy 中设置,告诉它不要池化连接。

为了进行故障排除,我建议设置disablereuse=On。这样您就可以快速确认您看到的线程是否由于池设置而保持打开状态。

确认问题后,您可以离开disablereuse=On或调整池设置。就我个人而言,我更喜欢它,disablereuse因为它更容易配置,并且在出现问题时更容易排除故障。

此外,与人们常说的相反disablereuse,我从未看到过使用它时可测量的性能影响。不过,您的情况可能会有所不同,因此,如果您启用此设置,您应该准备好监控潜在的性能影响。

相关内容