AJP用尽了线程

时间:2014-10-27 13:49:39

标签: multithreading apache jboss5.x ajp

我有两个使用mod_jk运行的apache负载平衡代理服务器(名为A1,A2)和两个Jboss Web服务器(名为J1,J2)。

Jboss版本是jboss-eap-5.1。    Apache版本是2.2.15。    操作系统:红帽企业Linux服务器版本6.4(圣地亚哥)    A1和A2 colud都将请求(使用端口80)从外部重定向到J1,J2(都是端口8080)。 A1,A2的设置相同(HostIP除外)。 J1,J2也有相同的设置。(HostIP和jvmRoute除外)

我对这个架构有一些问题。 J1和J2可以很好地处理A1的请求(收到请求 - >创建要处理的线程 - >处理完成 - >关闭线程)。

但A2的要求很奇怪。当过程结束时,线程没有关闭。并且网络连接保持在ESTABLISHED。   我使用jstack PID来检查,​​并且有很多以下语句:

"ajp-XX.XX.72.12-8009-240" daemon prio=10 tid=0x00007f791418e800 nid=0x7793 runnable [0x00007f7875d5c000]
   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:1036)
    at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:1115)
    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:383)
    at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:385)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:451)
    at java.lang.Thread.run(Thread.java:662)`

将上述PID(nid = 0x7793)与ps -efT |进行比较grep 30611,可以得到以下内容:     `xxxx 17869 30611 17821 0 20:40? 00:00:00 / usr / local / java / bin / java -program.name = run.sh ...

虽然我使用netstat -A inet,但有很多这样的连接:

Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 npouiap2:8009               10.100.84.34:49666          ESTABLISHED 
tcp        0      0 npouiap2:8009               10.100.84.34:50374          ESTABLISHED 
tcp        0      0 npouiap2:8009               10.100.84.34:50507          ESTABLISHED 

1 个答案:

答案 0 :(得分:1)

问题可能是线程没有空闲,因为 AJP连接默认是持久的。

您可以尝试其中一个选项:

  1. 将JBoss上的maxThreads增加到与"max threads"相同 (确切的指令因MPM而异)在httpd
  2. 开启mod_jk's disable reuse option
  3. 选项2是最简单的应用和验证问题是否仍然存在。