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の問題によるものですか?
デフォルトでは、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" />
これがお役に立てば幸いです。