web-dev-qa-db-ja.com

TomcatAJPポートへの古いネットワーク接続

Mod_jkコネクタを使用してTomcatアプリケーションサーバーをApacheサーバーに接続しています。どちらも異なるサーバーで実行されています。

Apache -----> ------ファイアウォール-----> ------ Tomcat

過去数日間、Tomcat AJPコネクタプールのスレッド数がいっぱいになっている(100%)のを確認しています。また、Apacheサーバーでエラーが発生しています。

トラブルシューティングの手順: Apacheサーバーを停止し、Apacheサーバーで次のコマンドを実行しました

> netstat -an | grep 8009 | wc -l
0

次に、Tomcatサーバーで同じコマンドを実行しましたが、ApacheからAJPポートへの多くの接続がまだ確立された状態であることがわかりました。

> netstat -an | grep 8009
tcp        0      0 :::8009                     :::*                        LISTEN      
tcp        0      0 ::ffff:192.168.1.75:8009     ::ffff:192.168.10.75:56840   ESTABLISHED 
tcp        0      0 ::ffff:192.168.1.75:8009     ::ffff:192.168.10.75:56838   ESTABLISHED 
---deleted remaining lines----

私は1〜2時間待っていましたが、これらの古い接続がまだ残っていることがわかりました。

次のTomcat設定があります:

Tomcat.maxthreads=200
Tomcat.minsparethreads=50
Tomcat.maxidletime=10000
Tomcat.acceptcount=100

次のスレッドを示すスレッドダンプ:

"ajp-bio-8009-exec-70" daemon prio=10 tid=0x00007fb87c3a1800 nid=0x302b runnable [0x00007fb8605c4000]
   Java.lang.Thread.State: RUNNABLE
    at Java.net.SocketInputStream.socketRead0(Native Method)
    at Java.net.SocketInputStream.read(SocketInputStream.Java:152)
    at Java.net.SocketInputStream.read(SocketInputStream.Java:122)
    at org.Apache.coyote.ajp.AjpProcessor.read(AjpProcessor.Java:312)
at org.Apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.Java:367)
at org.Apache.coyote.ajp.AjpProcessor.process(AjpProcessor.Java:118)
at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:611)
at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:314)
- locked <0x000000051b0a2ee0> (a org.Apache.Tomcat.util.net.SocketWrapper)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61)
at Java.lang.Thread.run(Thread.Java:745)

Tomcatへの古い接続をすべてクリーンアップするには、再起動する必要があります。

この問題のトラブルシューティングを手伝ってください。これはサーバーの問題によるものですか、それともTomcatまたはmod_jkの問題によるものですか?

2
ArunS

デフォルトでは、mod_jkすべての接続を維持しますajp1接続は無期限に開きますが、tcpセッションを介してキープアライブをTomcatサーバーに送信しません。その接続がアイドル状態の場合、開いたままになります。ただし、ファイアウォールはアイドル状態のセッションを好みません。一定期間非アクティブになると、その接続が切断されます。これが、アプリケーションへの最初の接続がハングする理由です。 ajp1現在開いているtcp接続に接続を渡しますが、ファイアウォールがその接続を切断しました。

追加してみてくださいworkers.properties、各ワーカーのこのパラメーター:

worker.ajp13.socket_keepalive=True
worker.ajp13.connection_pool_timeout=300

server.xml Tomcat ajp1コネクタセクションで、connectionTimeoutパラメータを追加します。

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
connectionTimeout="300000" />  

これがお役に立てば幸いです。

3
Federico Sierra