TOP > 機能紹介 > PerformanceDoctor > ルール詳細 ~ スレッドブロック

ルール詳細


メッセージ

Threadのblock時間(synchronizedなど)が閾値を超えています。

【ルールID】 COD.THRD.BLK_TIME


メッセージからは、以下の内容がわかります。

  1. スレッド名
  2. ブロック時間
Threadのblock時間(synchronizedなど)が閾値を超えています。

問題の概要

スレッドブロックとは

マルチスレッドで処理が行われる場合、 1つのオブジェクトに複数のスレッドが
同時にアクセスする可能性が出てきます。
下の図のように、スレッドAがオブジェクトのデータを読み取っている間にスレッドBが
そのデータを書き換えたりなど、意図していない結果になってしまう場合があります。

スレッドブロック処理の問題点

このようなことが起こらないように、スレッドは排他処理によって制御されているのが
一般的です。
つまり、スレッドAがオブジェクトのデータを読み取っている間、スレッドBからデータの
値を変更できないようにオブジェクトをプロックしておきます。
通常のスレッドブロック処理

しかし、不適切な排他処理が行われた場合、スレッドAがオブジェクトをブロックしている
時間が必要以上に長くなり、スレッドBが処理を開始できない、という状況になることがあります。

ENdoSnipeは、ブロック時間が閾値を超過したことを検出します。



原因の特定

1.問題となっているスレッドを確認します。

  1. 詳細ビューで、ブロックしているスレッドを確認します。
    下の図のように「thread.monitor.owner」でブロックしているスレッドを確認できます。
  2. i のスタックトレースを確認し、問題箇所を特定します。
ブロックしているスレッドを確認します。

2. 1の解放を待っているスレッドを確認します。

  1. 詳細ビューで、ブロックされているスレッドを確認します。
    下の図のように「thread.monitor.thread」でブロックされているスレッドを確認できます。
ブロックされているスレッドを確認します。

対処

PerformanceDoctorのメッセージからブロックをしているスレッドがわかります。
スタックトレースから問題箇所のソースコードを特定し、修正します。



設定方法

ENdoSnipeでスレッドブロックを検出したい場合は、以下の通り設定してください。
設定変更は、Javelinの設定ファイル(javelin.properties)または、BottleneckEyeのコントロール画面から
行うことができます。


No. プロパティ 設定値 概要
1 javelin.thread.monitor true スレッドの監視をするかどうかを設定します。 javelin.thread.monitorプロパティがtrueの場合、 ENdoSnipeは、Javaアプリケーションのスレッドにおける性能問題に関する情報を取得します。
2 javelin.thread.monitor.interval 任意 スレッドの監視を行う周期を設定します。(単位:ミリ秒)
初期値は1000です。
これは、 javelin.thread.monitorプロパティがtrueの場合に有効です。
3 javelin.thread.blocktime.threshold 任意 スレッドのブロック時間の閾値を指定します。(単位:ミリ秒)
指定した時間を超過した場合に、問題として検出します。
初期値は2000です。
これは、javelin.thread.monitorプロパティがtrueの場合に有効です。
4 javelin.thread.monitor.depth 任意 スレッドブロックを検出した場合に取得するスタックトレースの深さを設定します。初期値は10です。