- PR -

マルチスレッド動作を確認したい

投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-05-18 14:51
こんにちわ。

経緯としては以下のような感じです。

・本来同期するべきでない処理で同期(synchronized)していたため性能に問題あり
・性能改善のため、同期処理をはずす(synchronized除去)

ここで、試験をすることになりますが、項目として以下の観点を出したいと思っています。

・きちんとマルチスレッド(同期せず)で動作しているか

つまり、いくつかの処理を一斉に走らせてみることになると思いますが
その時の確認方法がわからず困っています。


何かのツールを使えば、スレッドがマルチで動作していることを確認できる
でしょうか?
# java付属のhprofとかじゃ無理ですかね・・

何か便利そうなツール等、アドバイスあればお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-05-18 15:32
ある時点でどのスレッドがどのような処理をしているか、を知りたいということでしょうか?
それでしたらスレッドダンプを取得するのが良いかと思います。

以下のページはスレッドダンプの読み方を知るのに有用かと。
http://www1.jpn.hp.com/products/software/development/java/tips/tune/p23.html
http://yusuke.homeip.net/samurai/index.html
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-05-18 16:02
インギさん
ありがとうございます。

スレッドダンップについては、ちょっと知識がないのでこれから調査
してみます。

イメージとして一番簡単な確認方法はログを見て

1...start
2...start
1...end
3...start
2...end
3...end

とか、synchronizedをはずした箇所のログが出ていれば良いのですが
該当のソースに関してはそううまくできそうにないので、上記確認を
別のツールでわかるものか、と思ったしだいです。
# うまくできそうにないというのは既に完成しているモジュールでは
# 該当箇所にログ出力処理がないため

スレッドダンプで確認するには

・各スレッドでwaitが発生していないこと

という視点で確認することになるんですかね。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-05-18 16:25
そうですね。synchronized の範囲が必要以上に広くて処理が直列化されてしまっているような場合、待っているスレッドは "waiting for monitor entry"(Sun/HPUX の JVM の場合) などと表示されます。
侍で見れば待っているスレッドは赤く表示されます。

たくさんスレッドダンプをとってもほとんどのスレッドが runnable (侍なら白)で何らかの処理をしているようであれば正常にマルチスレッドで動作していると考えられます。

また、最適化前のパフォーマンス低下の原因が本当に synchronized ブロックのせいにあるのかどうかは、やはりスレッドダンプを取得すればわかります。ひどいコードが動いているとほとんどのスレッドが "waiting for monitor entry"(侍で見ると真っ赤っか)になります。

とにかく、解析のコツは複数回スレッドダンプをとって傾向を見ることです。

[ メッセージ編集済み 編集者: インギ 編集日時 2005-05-18 16:27 ]
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-05-18 16:47
「マルチスレッドで動作していること」

「マルチスレッドで「正しく」動作していること」
の間にはかなりの距離があるように思いますが…

一部の同期処理を外したことによる副作用が無いことの証明って、どうやるのでしょう?

・マルチCPUマシン上での長時間高負荷試験を実施し、処理結果で稀に不整合が
発生するようなことが発生しないことを確認する
・マルチスレッドプログラミングに関して知見のある技術者を交えたソースコー
ドレビュー

くらいしか思いつかないのですが、みなさんはどうしてますか?


[ メッセージ編集済み 編集者: シュン 編集日時 2005-05-18 16:50 ]
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-05-18 16:57
引用:

シュンさんの書き込み (2005-05-18 16:47) より:
・マルチCPUマシン上での長時間高負荷試験を実施し、処理結果で稀に不整合が
発生するようなことが無いこと
・マルチスレッドプログラミングに関して知見のある技術者を交えたソースコー
ドレビュー

くらいしか思いつかないのですが、みなさんはどうしてますか?




こんにちわ。

今回、性能試験において明らかに性能が悪い結果となりソースコードレビュー
にて動作を確認していました。

その際、明らかにsynchronizedしても意味がない箇所において同期していたため
その後の処理が全てのスレッドで同期化してしまったという事象です。

synchronizedをはずす前と後で既に試験は行っており、性能も測定しております
# 内部レベル

そいういう意味で、今回お客様先での試験となり

・機能確認試験
・性能試験

が控えているところです。

この機能確認試験ではおっしゃるように、「マルチスレッドで「正しく」動作していること」
を確認するこが重要であり、単にマルチで動いているだけでなく、いくつかのケース
を考慮し、整合性が取れることも確認します。

とりあえず、マルチで動いてることの確認ということでの質問でした。


---

ただ一つ気になるのは、スレッドダンプで結果検証するとなると
「waitしていないこと」の確認になるので、たまたまwaitしてないとも限らない
わけで結構ムズかしいのか、と思ったり。

何回か試行してみて一回も出ないことって確認方法くらいしか思いつかない。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-05-18 17:52
>ただ一つ気になるのは、スレッドダンプで結果検証するとなると
>「waitしていないこと」の確認になるので、たまたまwaitしてないとも限らない
>わけで結構ムズかしいのか、と思ったり。
>
>何回か試行してみて一回も出ないことって確認方法くらいしか思いつかない。
そうですね。
定量的に修正の有効性を計るには修正前のスレッドダンプと修正後のスレッドダンプ両方をたくさん取得して、待ち状態になっているスレッドが出現する割合を測定する必要があるかと存じます。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-05-18 17:55
引用:

(株)ぽちさんの書き込み (2005-05-18 16:57) より:

ただ一つ気になるのは、スレッドダンプで結果検証するとなると
「waitしていないこと」の確認になるので、たまたまwaitしてないとも限らない
わけで結構ムズかしいのか、と思ったり。

何回か試行してみて一回も出ないことって確認方法くらいしか思いつかない。



そういうことでしたら、例えば、デバッガで該当個所にブレークポイントを張って
おいてからテストを開始して暫くほうっておき、スレッドダンプで複数のスレッド
がすべてブレークを貼った個所で停止していること(修正前は該当個所での停止は
1スレッドだけで、それ以外のスレッドは全てsynchronized構文の入り口で停止し
ているはず)、ブレークポイントを外して再開したら問題なく動作を完了すること
などを確認すればよいかと思いますが、いかがでしょう。

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