Tomcat服务器冻结并完全停止响应。重启似乎是将其重新联机的唯一方法。线程转储显示服务器在AJP线程上最大化。我为maxThread设置了默认值(200),当我的服务器挂起时,我在“RUNNABLE”和“监视器上锁定”状态下看到了200个AJP线程。此问题通常每3到4天发生一次。服务器没有大量加载,它每5分钟左右就会发出一个请求。这是某种ajp-thread泄漏问题吗?
一旦达到AJP线程数量的最大限制,服务器就无法创建新的AJP线程,我可以理解这是预期的行为。但我正在努力理解的是
有没有人遇到类似的问题?这是Tomcat中的已知问题/错误吗?感谢您的帮助!
AJP-Thread的线程转储片段:(如果有人想查看它,我可以发布完整的线程转储...请告诉我)
"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)
由于
答案 0 :(得分:1)
我似乎无法发表评论......
你的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" />
希望这会有所帮助
的问候,
答案 1 :(得分:0)
如果您使用的是启用了keepAlive选项的Web服务器,则您的AJP线程可能会陷入keepAlive状态。
要验证AJP线程的状态,您可以登录tomcat管理器应用程序(例如http://localhost:8080/manager)并转到服务器状态选项卡。您应该看到所有AJP线程的状态。你会看到一个&#34; K&#34; (keepalive状态)在AJP线程池中所有线程的最左列。
如果使用这些类型的线程最大化AJP线程池,并且这些线程上的时间戳确实很旧,那么您可能有一个Web服务器正在发送Keep-Alive标头。浏览器平均发送6-8 parallel requests per site,因此每个浏览器会话最多可导致8个AJP线程陷入keepAlive状态。在几个用户访问您的站点后,您将看到AJP线程池在keepAlive状态下获得最大连接。
您可以将server.xml中的keepAliveTimeout设置为与Web服务器keepAliveTimeout相同以解决问题。 connectionTimeout参数也可以用作额外的防御层,以防止AJP线程池被最大化。
注意:根据tomcat 7 documentation,如果在server.xml中设置connectionTimeout但不设置keepAliveTimeout,则keepAliveTimeout将设置为connectionTimeout的任何内容。