Multithreading AJP螺纹用尽

Multithreading AJP螺纹用尽,multithreading,apache,jboss5.x,ajp,Multithreading,Apache,Jboss5.x,Ajp,我有两个apache负载平衡代理服务器(名为A1,A2)与mod_jk一起运行,还有两个Jboss web服务器(名为J1,J2) Jboss版本是Jboss-eap-5.1。 Apache版本是2.2.15。 操作系统:Red Hat Enterprise Linux Server 6.4版(圣地亚哥) A1和A2 colud都将请求(带有端口80)从外部重定向到J1、J2(都是端口8080)。A1、A2的设置相同(HostIP除外)。J1、J2也具有相同的设置。(除了HostIP和jvmRo

我有两个apache负载平衡代理服务器(名为A1,A2)与mod_jk一起运行,还有两个Jboss web服务器(名为J1,J2)

Jboss版本是Jboss-eap-5.1。 Apache版本是2.2.15。 操作系统:Red Hat Enterprise Linux Server 6.4版(圣地亚哥) A1和A2 colud都将请求(带有端口80)从外部重定向到J1、J2(都是端口8080)。A1、A2的设置相同(HostIP除外)。J1、J2也具有相同的设置。(除了HostIP和jvmRoute)

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

但A2的要求很奇怪。当进程完成时,线程没有关闭。并且网络连接保持在已建立状态。 我使用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 

问题可能是线程不是空闲的,因为默认情况下,AJP连接是持久的

您可以尝试以下选项之一:

  • 增加JBoss上的
    maxThreads
    ,使其与
    “max threads”相同
    (具体指令因MPM而异)关于httpd
  • 打开
    mod_jk的

  • 选项2是应用和验证问题是否仍然存在的最简单方法。

    Hi Sierra,感谢您的回复。问题在于A1和A2的设置相同,但只有A2的连接会导致AJP螺纹挂起。我认为这可能不是设置maxThreads造成的。选项2似乎解决了A1、A2上的连接挂起问题。但情况是连接挂起在J1、J2上。@nsnosheep您尝试过停止A1服务器,只处理A2请求吗?apache错误日志中有任何消息吗?@Sierra我无法停止A1服务器。因为它在我公司的生产环境中运行,并提供7*24服务。我在J1和J2上运行了tcpdump。了解从A1、J1和J2发送的请求是否会同时得到包(一个得到11个包,另一个得到3个包)。如果请求从A2发送,则只有J1或J2中的一个将获得包(14个包)。我查看了这些包,发现A2中的包有3个SYN包不是从A1发送的。@nsnosheep AJP是常量协议。一旦建立连接,就不会释放连接,而是重新使用。除非设置connectionTimeout,它基本上不是“连接”超时,而是通过持久连接发出的两个http请求之间的超时。为此,我认为A1在某个时刻占据了JBoss的所有线程。如果我错了,你可以尝试添加禁用重用选项y测试。嗨,塞拉。我已经考虑过了。明天我将与负责Infra的同事讨论。但是有点奇怪。如果A1占用了JBoss的所有线程,为什么我仍然可以从A2发送请求并获取内容?谢谢你的回答D