如何防止响应缓慢的 Tomcat 导致 Apache 响应缓慢?

如何防止响应缓慢的 Tomcat 导致 Apache 响应缓慢?

我有一个网站,主要由静态 html 页面组成,偶尔会有 ajax 请求。该网站在 Apache 上运行,ajax 由 Tomcat 处理。

如果 Tomcat 响应缓慢(java 无法连接到数据库服务器,或者由于某种原因需要很长时间来处理请求) - 它会导致整个站点瘫痪:所有静态 html 页面都需要很长时间才能加载(图像、css、js 也是如此)。

现在,如果我手动停止 Tomcat,一切仍然可以正常工作 - 网站速度很快并且响应迅速,只是 ajax 请求不起作用。

如何让响应缓慢的 Tomcat 不使用所有 Apache 资源,这样无论 Tomcat 发生什么情况,静态页面都能正常工作? 对我来说,响应式 html 页面比不工作的 ajax 重要得多。

httpd配置文件

Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule prefork.c>
StartServers       16 
MinSpareServers   10 
MaxSpareServers   40
ServerLimit      512 
MaxClients       512
MaxRequestsPerChild  4000
</IfModule>

工人.属性

worker.worker1.port=8888
worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000

服务器.xml

 <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8081" />

<Connector port="8888" scheme="http" protocol="AJP/1.3" redirectPort="8889" minSpareThreads="100"  maxThreads="400" connectionTimeout="20000" acceptorThreadCount="2"/>

答案1

如果出于某种原因,tomcat 无法快速处理您的 ajax 请求,这会减少您的 apache 可以处理的请求数量。Tomcat 配置为并行处理 400 个请求,默认值为acceptCount100。因此,您的 tomcat 至少能够处理 500 个请求:jvm 和平台相关,可能还会有更多的连接请求排队。

worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000

..告诉 mod_jk 等待大约 1.7(socket_timeout 以秒为单位)用于套接字操作,用于来自 tomcat 的单个网络数据包的时间为 2 分钟。您应该调整这些值,以便让 mod_jk 在 tomcat 速度较慢时尽早返回错误。

假设您的 ajax 请求通常在一秒内处理完毕,最长可达两秒。处理完毕后,响应将立即返回。然后可以设置worker.worker1.reply_timeout=2500,只需多半秒。socket_timeout甚至可以省略,因为它只是一个粗略的值。socket_connect_timeout定义从 apache/mod_jk 连接到 tomcat 可能需要多长时间的,应将其添加到 worker.properties 并设置为非常低的值,例如 100。因为两者都位于同一台服务器上。请参阅Apache Tomcat 连接器 - 参考更多细节。

从 apache 到 tomcat 的每个请求都取决于您MaxClients在 httpd.conf 中配置的内容。在 tomcat 中滞留的请求越多,apache 处理的静态内容就越少。如果在这种情况下关闭 tomcat,静态内容将再次快速交付,因为它释放了 mod_jk 和 apache 中请求处理的资源。

您同时在 httpd.conf 中配置了prefork.c和。我猜是活动的,因为它设置为 512,这与您的观察和我的解释相符。;-)worker.cprefork.cMaxClients

告诉 mod_jk 尽早放弃对 tomcat 的长时间运行请求可能会有很大帮助,但您还应该考虑调整 apache 处理的客户端请求数 ( MaxClients) 和 tomcat 并行处理的请求数 ( <connector maxThreads=...)。这些数字必须与正常操作期间发生的情况保持平衡。跟踪页面加载可能会有助于了解这些值应占的比例。绝对值取决于您的服务器规格、网络状况、客户端数量等。

如果可能的并行请求的绝对数量太低,用户会抱怨页面加载缓慢,而您不会看到服务器满负荷运行。如果绝对数量太高,它会使用比实际需要更多的内存,甚至会减慢速度,并且无法从子系统(例如数据库)的问题中快速恢复。如果 apache 向 tomcat 发送的请求远远多于它及时处理的请求,您会看到其中一些请求超时,而其他请求则在可接受的时间内得到处理。在 apache 和 tomcat 上以类似的值开始并不是坏主意,只要超时设置确保缓慢或无响应的 tomcat 不会成为 apache 的负担。

答案2

您似乎只定义了一个 worker。这意味着 Apache 只能通过该实例与 Tomcat 通信。正常的 JK 配置包含 8-16 个 worker。请查看默认的 JK 配置文件,您可以下载该文件。

相关内容