2014-01-07 42 views
4

Tomcat服务器冻结并完全停止响应。重新启动似乎是将其重新联机的唯一方法。线程转储显示服务器在AJP线程上最大化。我为maxThread设置了默认值(200),当我的服务器挂起时,我在“RUNNABLE”和“locked on monitor”状态下看到了200个AJP线程。这个问题通常每3到4天发生一次。服务器没有大量装载,它每隔5分钟左右服务一次。这是一种ajp线程泄漏问题?Tomcat 7几天后冻结

服务器无法创建新的AJP线程,一旦达到数量AJP线程的最大限制,我可以理解这是预期的行为。但我很难理解的是

  • 为什么服务器不断创建新的AJP线程来提供新的请求,当“RUNNABLE”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) 

感谢

回答

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" /> 

希望这有助于 问候,

0

如果您使用的是Web服务器用keepalive选项启用,您的AJP线程可能被陷在存活状况。

要验证AJP线程的状态,可以登录到tomcat管理器应用程序(例如http://localhost:8080/manager)并转到服务器状态选项卡。你应该看到你所有的AJP线程的状态。对于AJP线程池中的所有线程,您将在最左列中看到“K”(保活状态)。

如果AJP线程池被这些类型的线程最大化,并且这些线程上的时间戳真的很老,那么您可能有一个发送Keep-Alive头的Web服务器。平均而言,浏览器发送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。