我有兩個運行mod_jk的Apache負載平衡代理服務器(名爲A1,A2)和兩個Jboss Web服務器(名爲J1,J2)。AJP用完線程
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的請求(recive請求 - >創建一個線程來處理 - >處理完成 - >關閉線程)。
但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 /本地/ JAVA /斌/ 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
嗨Sierra, 感謝您的回覆。問題是A1,A2具有相同的設置,但只有來自A2的連接纔會導致AJP線程掛起。我認爲這可能不是由設置maxThreads造成的。 而選項2似乎解決了連接在A1,A2上的問題。但情況是,連接在J1,J2上。 – nsnosheep 2014-10-28 06:54:34
@nsnosheep你試過停止A1服務器,只處理A2請求? apache錯誤日誌中是否有消息? – 2014-10-28 09:58:18
@Sierra我無法停止A1服務器。導致它運行在我公司的生產環境中,並提供7 * 24服務。 我在J1和J2上運行tcpdump。發現如果從A1,J1和J2發送的請求將同時獲得包(一個獲得了11個包,另一個獲得了3個包)。如果從A2發送請求,則只有J1或J2中的一個會獲得包(14包)。 我看了那些軟件包,發現A2的軟件包有3個SYN軟件包沒有從A1發送。 – nsnosheep 2014-10-28 10:56:41