首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫7在几天后冻结

猫7在几天后冻结
EN

Stack Overflow用户
提问于 2014-01-07 06:42:45
回答 2查看 1.9K关注 0票数 4

Tomcat服务器完全冻结并停止响应。重新启动似乎是使其恢复正常运行的唯一方法。线程转储显示,服务器在AJP线程上达到最大值。我为maxThread设置了默认值( 200 ),当我的服务器挂起时,我看到正好有200个AJP线程处于"RUNNABLE“和”锁定监视器“状态。此问题通常每3至4天发生一次。服务器负载不重,它每5分钟左右就提供一次请求。这是ajp线程泄漏的问题吗?

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

  • 为什么当"RUNNABLE“AJP线程在池中可用时,服务器继续创建新的ajp线程来服务新请求?

有没有人遇到过类似的问题?这是Tomcat中的一个已知问题/bug吗?感谢你的帮助!

线程转储片段的AJP-线程:(我可以张贴完整的线程转储,如果有人想看它.请让我知道)

代码语言:javascript
复制
    "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)

谢谢

EN

回答 2

Stack Overflow用户

发布于 2016-11-16 17:11:05

我似乎还不能发表评论..。

在您的server.xml文件中是否设置了connectionTimeout值?

代码语言:javascript
复制
<!-- 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
EN

Stack Overflow用户

发布于 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是什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20965486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档