- - PR -
Tomcat アプリケーションハングについて
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-04 18:13
インギさんご回答いただきありがとうございます。
仰るとおりすべてのスレッドが ">" でした。(6列)
とりあえず、Struts のソースを解析してみます。 | ||||||||||||||||||||||||
|
投稿日時: 2006-12-04 20:56
org.apache.struts.action.Action.isTokenValid(Action.java:671) 部分を確認してみました。
org.apache.struts.action.Action
org.apache.struts.util.TokenProcessor
TokenProcessor#isTokenValid(HttpServletRequest request, boolean reset)が synchronized にて実装されており、恐らくここで Wait 状態になっていると考えられます。 となると、いつ Wait 状態になって、いつ処理は終了するのでしょう? インギさんの言うとおり、まず、プロセス数の最大値を 50 〜 100 にすべきでしょうか? [ メッセージ編集済み 編集者: ひじき 編集日時 2006-12-04 20:57 ] | ||||||||||||||||||||||||
|
投稿日時: 2006-12-05 12:18
なるほど。外部リソースでのロックとかそっち側ですね。
インスタンスメソッド自体にsynchronizedが付いているので、 TokenProcessorの該当オブジェクトの別のsynchronizedなインスタンスメソッドが 存在すればそちらでロックしている可能性もありますし、どこかで
となっている場所があってもロックできてしまいますね。 ロックしている「どこか」が再開しない限りは止まったままでしょうね。 そしてその「どこか」を探すのが大変なんだ、コレが。 session.getAttribute()の実装がsynchronizedになっていて デッドロックしているとかってないですかね。 ぱっとみて他に怪しそうなところが見当たらないですが…。 | ||||||||||||||||||||||||
|
投稿日時: 2006-12-05 12:20
ロック取得待ちであれば "- waiting to lock" とか表示されそうなものですが、スレッドダンプには表示されていないんでしょうか?
表示されていれば侍を使えば1クリックでロックを取得しているスレッドを辿ることが出来ますね。 表示されていないとすると VM レベルで異常な状態になっている可能性があります。単にロック処理中に非常にビジーになっているだけかもしれませんが。 [ メッセージ編集済み 編集者: インギ 編集日時 2006-12-05 12:28 ] | ||||||||||||||||||||||||
|
投稿日時: 2006-12-05 12:49
この侍ってのはなかなか便利ですね。 ロックの取得スレッドが取れるとなればデッドロックは 再現さえさせれれば用意に解決できますね。 ビジーなのだとすればプロセス数を減らした 低負荷な環境を用意して再現させれればよいのかなぁ。 ひじきさんの提示されたStrutsのソースを見る限りでは システムリソースとかでロックされる余地はなさそうに見えますが…。 | ||||||||||||||||||||||||
|
投稿日時: 2006-12-05 14:09
あ、あと OutOfMemoryError が発生して VM が不正な状態になっているということはないでしょうか?
| ||||||||||||||||||||||||
|
投稿日時: 2006-12-05 14:22
Strutsのソースを確認してもwait()かけている箇所がなかったので、
NPTL絡みの情報を書いてみたのですが、思いっきりスルーされてます・・・。 LD_ASSUME_KERNELで試して見るのが良さそうだと思うのですが。 | ||||||||||||||||||||||||
|
投稿日時: 2006-12-05 15:17
どうやって探すのでしょうか。。。見当がつきません。
"waiting to lock" は出力されておりませんでした。 再度スレッドダンプを見直しましたところ waiting on condition の他に 以下の状態のスレッドがありました。抜けがありすみません。 "TP-Processor280" daemon prio=1 tid=0x086beaf0 nid=0x30a runnable [765fe000..765fe814] at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:183) at java.io.BufferedInputStream.read1(BufferedInputStream.java:222) at java.io.BufferedInputStream.read(BufferedInputStream.java:277) - locked <0x58b3d6b8> (a java.io.BufferedInputStream) at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:598) at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:535) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:663) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:866) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:534) "TP-Processor234" くらいまでで 10 箇所 "TP-Processor276" daemon prio=1 tid=0x086bc9b0 nid=0x30a in Object.wait() [763fe000..763fea14] at java.lang.Object.wait(Native Method) - waiting on <0x58b476a0> (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Object.wait(Object.java:429) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:655) - locked <0x58b476a0> (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Thread.run(Thread.java:534) "TP-Processor269" daemon prio=1 tid=0x086b60b8 nid=0x30a in Object.wait() [7607e000..7607ed94] at java.lang.Object.wait(Native Method) - waiting on <0x58b597f0> (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Object.wait(Object.java:429) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:655) - locked <0x58b597f0> (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Thread.run(Thread.java:534)
VM で異常な状態になっているのを確認する方法ってないですよね。。。 もしかしたら、何分か待てば runnable 状態に変わるなんてこともありえますかねぇ?(最長10分くらい待っていたと思います)
これについては検証できると思いますの再現テストしてみます。
それも出力されておりません。catalina.out 、システムログ等を何度も確認しておりますがそれらしいエラーは出力されておりません。 VM Abort するわけでもありません。よっぽど Abort してもらったほうが解決しやすい問題だとは思うのですが。。。
放置してしまい、すみません。 OS まわりのことはあまり詳しくないのですが、NPTLとはスレッドの種類のことでしょうか? 環境変数に追加するのでしょうか? export LD_ASSUME_KERNEL=X.X.XX 誠に、おはずかしながら知識が足りないようです。 現在どういう問題があって、どういう設定をすると、どういう効果があるのかお教えいただけますでしょうか。 |