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

ルール詳細


メッセージ

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

【ルールID】 COD.THRD.BLK_CNT


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

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

問題の概要

スレッドブロックとは

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

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

このようなことが起こらないように、スレッドは排他処理によって制御されているのが
一般的です。
つまり、スレッド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.block.threshold 任意

スレッドのブロック回数の閾値を指定します。
指定した回数を超過した場合に、問題として検出します。
初期値は1000です。
これは、javelin.thread.monitorプロパティがtrueの場合に有効です。

4 javelin.thread.monitor.depth 任意 スレッドブロックを検出した場合に取得するスタックトレースの深さを設定します。初期値は10です。