私はいくつかのTomcatインスタンスを実行し、時々リクエストへの応答を停止するものもあります-すべての接続でタイムアウトします。
Apache2.2でmod_proxyとともにAJPを使用しています。
TomcatのAJPコネクタを介してApache/AJPを介してタイムアウトが発生しますが、8080の直接HTTPコネクタを介してタイムアウトが発生します。
Apache内で/server-status
を構成しましたが、現在W
で処理されている16のリクエスト、4つのアイドルリクエスト、接続のない200以上の空きスロットが表示されます。私のAJPコネクタは次のように構成されています。
<Connector port="8009" address="localhost"
maxThreads="250" minSpareThreads="5" maxSpareThreads="15"
connectionTimeout="1000"
packetSize="16384"
maxHttpHeaderSize="16384"
enableLookups="false" redirectPort="8443"
emptySessionPath="true" URIEncoding="UTF-8" protocol="AJP/1.3"/>
したがって、新しい接続を受け入れるためのスレッドがたくさんあるはずです。
top
を使用すると、CPUが表示され、1%未満で待機し、Javaプロセスのメモリは80%です。60Mの空きメモリと200Mの空きスワップがあります。
を使用して特別なthreads.jsp
ページを設定しました
SystemThreadList stl = new SystemThreadList();
Thread[] allThreads = stl.getAllThreads();
これは有用な情報を提供しますが、この状態では、どちらもロードされません。
Catalina.logで私は見る:
Mar 07, 2014 11:53:09 AM org.Apache.jk.common.ChannelSocket processConnection
WARNING: processCallbacks status 2
他のWebリクエストからの不定期のアクティビティですが、私のものではありません。
コマンドラインから、またはプロファイラーを使用してスレッドとスタックトレースのリストを取得し、スタックしているものを見つける方法はありますか?
次のオプションを使用してRMIを有効にするようにTomcatを設定します。
-Dcom.Sun.management.jmxremote.port=12346
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=myhost
(これは例であり、セキュリティのベストプラクティスの説明ではありません...)
JDKにあるjconsoleを使用して、サーバーに接続します。
Tomcatも直接HTTPコネクタを介して応答しない場合、問題はAJPにあるのではなく、Tomcat内で何かがおかしいです。
あなたはcatalina.outに書き込まれる完全なスレッドダンプを取得することができます
kill -quit <Tomcat PID>