- PR -

スレッドダンプの検証について。

1
投稿者投稿内容
もぐ
常連さん
会議室デビュー日: 2004/08/23
投稿数: 22
投稿日時: 2004-08-26 13:09
現在、Windowsサーバ、JDK1.3.06、intra-mart3.2の環境において、startpackをカスタマイズしたシステムの検証を行っています。

このシステムは一定の負荷がかかると画面が固まり、SocketExceptionが吐かれます。
そのため、現在スレッドダンプを取っているのですが、1度スレッドダンプを取ると、サーバが落ちてします。その直後に再度スレッドダンプを取ると、初回吐かれたスレッドが吐かれていないことがわかりました。以下がそのスレッドダンプです。
↓初回
Full thread dump:

"Thread-5" prio=2 tid=0x93e9808 nid=0xd20 runnable [0x984f000..0x984fdb8]
at java.lang.Win32Process.waitFor(Native Method)
at com.intra_mart.system.observe.SrvProc.run(SrvProc.java:51)

"Thread-7" daemon prio=2 tid=0x8a4be28 nid=0xbec runnable [0x980f000..0x980fdb8]
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:178)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:275)
at java.io.FilterInputStream.read(FilterInputStream.java:88)
at java.io.InputStreamReader.fill(InputStreamReader.java:168)
at java.io.InputStreamReader.read(InputStreamReader.java:244)
at java.io.BufferedReader.fill(BufferedReader.java:134)
at java.io.BufferedReader.readLine(BufferedReader.java:294)
at java.io.BufferedReader.readLine(BufferedReader.java:357)
at com.intra_mart.system.observe.ObserveStreamThread.run(ObserveStreamThread.java:69)

"Thread-6" daemon prio=2 tid=0x93e9648 nid=0xee0 runnable [0x97cf000..0x97cfdb8]
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:161)
at java.io.InputStreamReader.fill(InputStreamReader.java:168)
at java.io.InputStreamReader.read(InputStreamReader.java:244)
at java.io.BufferedReader.fill(BufferedReader.java:134)
at java.io.BufferedReader.readLine(BufferedReader.java:294)
at java.io.BufferedReader.readLine(BufferedReader.java:357)
at com.intra_mart.system.observe.ObserveStreamThread.run(ObserveStreamThread.java:69)

"Thread-4" daemon prio=2 tid=0x8a41e78 nid=0xd84 waiting on monitor [0x938f000..0x938fdb8]
at java.lang.Thread.sleep(Native Method)
at com.intra_mart.system.observe.SrvCleaner.run(SrvCleaner.java:104)
at java.lang.Thread.run(Thread.java:479)

"Thread-3" daemon prio=2 tid=0x8a376d8 nid=0xcac runnable [0x930f000..0x930fdb8]
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:463)
at java.net.ServerSocket.implAccept(ServerSocket.java:238)
at java.net.ServerSocket.accept(ServerSocket.java:217)
at com.intra_mart.bin.ObsSrv.run(ObsSrv.java:106)
at java.lang.Thread.run(Thread.java:479)

"Thread-2" prio=5 tid=0x284950 nid=0xcd0 waiting on monitor [0..0x6fb30]

"Thread-1" prio=2 tid=0x8a02d60 nid=0xc18 waiting on monitor [0x92cf000..0x92cfdb8]
at java.lang.Thread.sleep(Native Method)
at com.intra_mart.system.observe.AgtSrv.run(AgtSrv.java:628)
at java.lang.Thread.run(Thread.java:479)

"Thread-0" daemon prio=2 tid=0x8abdf0 nid=0xc0c waiting on monitor [0x927f000..0x927fdb8]
at java.lang.Thread.sleep(Native Method)
at com.intra_mart.system.common.TimeCacheMap$TimeCacheMapList.run(TimeCacheMap.java:259)
at java.lang.Thread.run(Thread.java:479)

"Signal Dispatcher" daemon prio=10 tid=0x800c20 nid=0xb30 waiting on monitor [0..0]

"Finalizer" daemon prio=9 tid=0x7fdc98 nid=0x830 waiting on monitor [0x8c4f000..0x8c4fdb8]
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:103)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:157)

"Reference Handler" daemon prio=10 tid=0x7fc8c0 nid=0xbf4 waiting on monitor [0x8c0f000..0x8c0fdb8]
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:415)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:105)

"VM Thread" prio=5 tid=0x8298a8 nid=0xca0 runnable

"VM Periodic Task Thread" prio=10 tid=0x8088d8 nid=0xe48 waiting on monitor
"Suspend Checker Thread" prio=10 tid=0x808e58 nid=0x1b4 runnable

↓初回以降
Full thread dump:

"Thread-4" daemon prio=2 tid=0x8a41e78 nid=0xd84 waiting on monitor [0x938f000..0x938fdb8]
at java.lang.Thread.sleep(Native Method)
at com.intra_mart.system.observe.SrvCleaner.run(SrvCleaner.java:104)
at java.lang.Thread.run(Thread.java:479)

"Thread-3" daemon prio=2 tid=0x8a376d8 nid=0xcac runnable [0x930f000..0x930fdb8]
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:463)
at java.net.ServerSocket.implAccept(ServerSocket.java:238)
at java.net.ServerSocket.accept(ServerSocket.java:217)
at com.intra_mart.bin.ObsSrv.run(ObsSrv.java:106)
at java.lang.Thread.run(Thread.java:479)

"Thread-2" prio=5 tid=0x284950 nid=0xcd0 waiting on monitor [0..0x6fb30]

"Thread-1" prio=2 tid=0x8a02d60 nid=0xc18 waiting on monitor [0x92cf000..0x92cfdb8]
at java.lang.Thread.sleep(Native Method)
at com.intra_mart.system.observe.AgtSrv.run(AgtSrv.java:628)
at java.lang.Thread.run(Thread.java:479)

"Thread-0" daemon prio=2 tid=0x8abdf0 nid=0xc0c waiting on monitor [0x927f000..0x927fdb8]
at java.lang.Thread.sleep(Native Method)
at com.intra_mart.system.common.TimeCacheMap$TimeCacheMapList.run(TimeCacheMap.java:259)
at java.lang.Thread.run(Thread.java:479)

"Signal Dispatcher" daemon prio=10 tid=0x800c20 nid=0xb30 waiting on monitor [0..0]

"Finalizer" daemon prio=9 tid=0x7fdc98 nid=0x830 waiting on monitor [0x8c4f000..0x8c4fdb8]
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:103)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:157)

"Reference Handler" daemon prio=10 tid=0x7fc8c0 nid=0xbf4 waiting on monitor [0x8c0f000..0x8c0fdb8]
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:415)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:105)

"VM Thread" prio=5 tid=0x8298a8 nid=0xca0 runnable

"VM Periodic Task Thread" prio=10 tid=0x8088d8 nid=0xe48 waiting on monitor
"Suspend Checker Thread" prio=10 tid=0x808e58 nid=0x1b4 runnable

"Thread-5"と"Thread-7"が吐かれず、初回以降は何かしらのアクションを行い、スレッドダンプを取るとこの繰り返しとなります。スレッドダンプの検証は初めてのため、なかなか検討が付け辛い状況です。"Thread-5"と"Thread-7"が吐かれない事が何かしらの原因なのでしょうか?

スレッドダンプをみて、どこに検討を当て調べるのが適当か、
ご存知の方いらっしゃいましたら、宜しくお願い致します。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-08-26 15:09
スレッドダンプは、その時点でそれぞれのスレッドが何をしているかがわかります。
コールスタックがそれぞれ表示されますので一番上に表示されるスタックで何をしているか JavaDoc などで調べましょう。また、そのメソッドがよびだされるまでのスタックを追っていき、誰が呼びだしているのかを突き止めることが出来ます。

Thread-5 はプロセスを起動して、それが終了しているのを待っているようです。
http://java.sun.com/j2se/1.3/docs/api/java/lang/Process.html#waitFor()
Thread-7 はファイルから読み込みを行っているところです。
http://java.sun.com/j2se/1.3/docs/api/java/io/FileInputStream.html#read(byte[])

Thread-5/7 が表示されないのは実際にそのスレッドが存在しないからではないでしょうか?
上位のスタックをみると com.intra_mart... となっていますので、その後これらのスレッドが消失するのが適切かどうかは intra-mart の開発元にしかわからないことです。
1度スレッドダンプを取るとサーバが落ちてしまう、というのがよくわからないのですが、 Thread-5 で起動sれているプロセスが"サーバ"なのでしょうか?
スレッドダンプ自体は JVM の低レベルなレイヤで出力されるものなのでアプリケーションのレイヤに影響を与えることは大変稀です。
もぐ
常連さん
会議室デビュー日: 2004/08/23
投稿数: 22
投稿日時: 2004-08-26 15:38
インギさん、毎回返信ありがとうございます。
本当に助かります。
スレッドダンプを見て検証するという事自体のイメージがやっと掴めました。

 =========================================
  1度スレッドダンプを取るとサーバが落ちてしまう、というのがよくわからないのでが、   Thread-5 で起動sれているプロセスが"サーバ"なのでしょうか?
 =========================================
に関してですが、実際に一度スレッドダンプを取得後に画面遷移などのアクションをシステムに対して行うと、IE自身が[サーバが見つかりません。]という、いわゆるサーバが落ちた時に目にする画面になってしまうのです。その後にスレッドダンプを吐き出すと、Thread-5/7が出力されないという訳です。

しかも、intra-martが標準で提供しているVersionのシステムでは、上記と同じ動作を行っても、サーバは落ちる事無く、Thread-5/7は出力されます。
やはり、カスタマイズが問題の可能性が高いようですね。

更に検証を続けて行きます。
本当にありがとうございました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-08-27 09:16
カスタマイズ、というのがネイティブレベルの話であれば落ちてしまう原因に関係があるかもしれませんが、Javaレベルの話であれば関連性はちょっと疑問です。Java のコードレベルで何をしようと Thread-5 でキックしているプロセスにはなんら影響は与えませんから。

いずれにせよ JVM は最新バージョンにあげた方がよいですね。1.3.1_06 はかなり古いバージョンになりますので。
http://java.sun.com/j2se/1.3/download.html
もぐ
常連さん
会議室デビュー日: 2004/08/23
投稿数: 22
投稿日時: 2004-08-27 09:27
確かにJVMはかなり古いVersionなのですが、
それを最新版にあげるとなると契約の問題等発生するので
私にはどうすることもできません…。

同感ですが…。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-08-28 10:54
unibon です。こんにちわ。

Windows 上だと、Ctrl+Break を押すと思いますが、このキー操作が別のタスクを停止させるように働いているのではないでしょうか。スレッドダンプを出力させるためにはシグナルを送れば良いのだと思いますが、キー操作以外の方法で外部からシグナルを送ることを試すと良いかもしれません。
ちなみに、私も以前試したことがあるような気がするのですが、忘れてしまいました。
あるいは、JVM をデバッガ(Eclipse 等)の上で動かせば、デバッガの機能でスレッドを見ることができますが、そういうことはできるのでしょうか。
もぐ
常連さん
会議室デビュー日: 2004/08/23
投稿数: 22
投稿日時: 2004-08-30 14:58
返信ありがとうございます。

検討してみます。
1

スキルアップ/キャリアアップ(JOB@IT)