几天后Tomcat 7冻结了

时间:2014-01-07 06:42:46

标签: multithreading tomcat ajp

Tomcat服务器冻结并完全停止响应。重启似乎是将其重新联机的唯一方法。线程转储显示服务器在AJP线程上最大化。我为maxThread设置了默认值(200),当我的服务器挂起时,我在“RUNNABLE”和“监视器上锁定”状态下看到了200个AJP线程。此问题通常每3到4天发生一次。服务器没有大量加载,它每5分钟左右就会发出一个请求。这是某种ajp-thread泄漏问题吗?

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

  • 为什么服务器会在池中有“RUNNABLE”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)

由于

2 个答案:

答案 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的任何内容。