web-dev-qa-db-ja.com

Tomcat 6が突然応答を停止したことを診断する方法は?

私はいくつかの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リクエストからの不定期のアクティビティですが、私のものではありません。

コマンドラインから、またはプロファイラーを使用してスレッドとスタックトレースのリストを取得し、スタックしているものを見つける方法はありますか?

2
Nic Cottrell

次のオプションを使用して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を使用して、サーバーに接続します。

2
ETL

Tomcatも直接HTTPコネクタを介して応答しない場合、問題はAJPにあるのではなく、Tomcat内で何かがおかしいです。

あなたはcatalina.outに書き込まれる完全なスレッドダンプを取得することができます

kill -quit <Tomcat PID>
1
flup