Tomcat服务器完全冻结并停止响应。重新启动似乎是使其恢复正常运行的唯一方法。线程转储显示,服务器在AJP线程上达到最大值。我为maxThread设置了默认值( 200 ),当我的服务器挂起时,我看到正好有200个AJP线程处于"RUNNABLE“和”锁定监视器“状态。此问题通常每3至4天发生一次。服务器负载不重,它每5分钟左右就提供一次请求。这是ajp线程泄漏的问题吗?
服务器无法创建新的AJP线程,一旦达到AJP线程数的最大限制,我可以理解这是预期的行为。但我很难理解的是
有没有人遇到过类似的问题?这是Tomcat中的一个已知问题/bug吗?感谢你的帮助!
线程转储片段的AJP-线程:(我可以张贴完整的线程转储,如果有人想看它.请让我知道)
"ajp-bio-6109-exec-307" daemon prio=10 tid=0x00007f846d3bc800 nid=0x51c9 runnable [0x00007f842e4e3000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:316)
at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:371)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:128)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
- locked <0x00000007b4f6f9a8> (a org.apache.tomcat.util.net.SocketWrapper)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)谢谢
发布于 2016-11-16 17:11:05
我似乎还不能发表评论..。
在您的server.xml文件中是否设置了connectionTimeout值?
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="660" connectionTimeout="20000"
redirectPort="8443" URIEncoding="WINDOWS-1256" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" connectionTimeout="20000" URIEncoding="WINDOWS-1256" />希望这能帮上忙,
发布于 2016-11-26 03:27:10
如果您使用的是启用keepAlive选项的web服务器,则您的AJP线程可能会陷入keepAlive状态。
要验证AJP线程的状态,可以登录到tomcat管理器应用程序(例如http://localhost:8080/manager)并转到服务器状态选项卡。您应该看到所有AJP线程的状态。您将在最左边列中看到AJP线程池中所有线程的"K“(保持活动状态)。
如果AJP线程池被这类线程最大化,而且这些线程上的时间戳确实很旧,那么您可能有一个发送保持活动的头的web服务器。平均而言,一个浏览器发送每个站点6-8个并行请求,因此每个浏览器会话可以导致多达8个AJP线程陷入keepAlive状态。在几个用户访问您的站点之后,您将看到AJP线程池由于处于keepAlive状态的连接而被关闭。
您可以将keepAliveTimeout设置为与web服务器keepAliveTimeout相同,以解决问题。connectionTimeout参数还可以用作额外的防御层,以防止AJP线程池被最大化。
注意:根据tomcat 7文件,如果您在server.xml中设置了connectionTimeout而不是keepAliveTimeout,那么keepAliveTimeout将被设置为无论connectionTimeout是什么。
https://stackoverflow.com/questions/20965486
复制相似问题