使用対象:
複数のスレッドが同じリソースに同時にアクセスしようとすると、スレッドの競合が生じます。このページでは、Splunk AppDynamics を使用してスレッドの競合の問題を診断および解決する方法について説明します。
スレッドの競合により生じるパフォーマンスの問題
マルチスレッド プログラミング手法は、非同期処理を必要とするアプリケーションで一般的に使用されています。このようなアプリケーションでは、各スレッドに固有のコールスタックがありますが、スレッドからロック、キャッシュ、カウンタなどの共有リソースにアクセスしなければならないこともあります。「スレッド相関の有効化」を参照してください。
このような場合、同期の手法を使ってスレッドの干渉を防ぐこともできますが、今度はスレッドどうしが共有リソースへのアクセスを奪い合う場合があります。その結果、アプリケーション パフォーマンスの低下やデータ整合性の問題が発生する可能性があります。
Splunk AppDynamics では、ビジネストランザクションとサービスエンドポイントのスレッドの競合に関する問題を特定して解決できます。詳細については、Javaのマルチスレッドトランザクションのトレースを参照してください。
スレッドの競合の検出
Splunk AppDynamics は、インストゥルメント化されたアプリケーションのスレッドの状態に基づいてスレッドの競合を検出します。
JVMにおける以下のブロック状態(待ち状態)が識別されます。
- ロックの取得(
MONITOR_WAIT
) - 条件の待機(
CONDOR_WAIT
) - スリープ状態(
OBJECT_WAIT
) - ブロッキングI/Oオペレーション
OBJECT_WAIT
状態はアプリケーションが次のいずれかをコールしたときにトリガーされます。
Thread.sleep
Object.wait
Thread.join
LockSupport.parkNano
sLockSupport.parkUntil
LockSupport.park
ビジネス トランザクション フロー マップの [Potential Issues] ペインに、潜在的なスレッドの競合の問題に関するコントローラからの警告が表示されます。ここからブラウザを使用して、ビジネストランザクションまたはサービスエンドポイントのブロックされたスレッドと待機中のスレッドに関する追加情報にアクセスし、パフォーマンス問題の原因を特定できます。
以下のセクションでは、ブラウザを使用してビジネストランザクションとサービスエンドポイントの競合情報を表示する方法について説明します。
トランザクションスナップショットでのスレッドの競合
スレッドの競合情報を表示するには
- トランザクション スナップショットのナビゲーションページで、[Potential Issues] ペインから Thread Contention の問題としてラベル付けされた項目を探します。時間の列には、ブロックされた時間(待ち時間)が表示されます。
- ブロックされたメソッドに関する詳細情報を表示するには、スレッドの競合項目をクリックし、[Drill Down into Call Graph.] を選択します。
コールグラフには、スレッドの競合に関連する次の情報が表示されます。
- ブロック時間または待機時間を示すスレッド状態の任意のメソッドを右クリックし、[View Details.] を選択します。[Thread Contention] 詳細ペインが表示されます。
[Thread Contention] 詳細ペインでは、ブロックされたメソッドの名前が左上に表示され、[Thread Contention] の表に以下の情報が追加されます。
エレメント | 意味 |
---|
ブロックしているスレッド | ブロックしているオブジェクトのロックを保持するスレッド |
ブロックしているオブジェクト | ブロックされたスレッドがアクセスを待っているオブジェクト。 |
ブロック時間 | オブジェクトへアクセスするための待ち時間合計。 |
行番号 | ブロックされたメソッドで、ブロックしているオブジェクトがアクセスされる行番号。 上記の例では、run は行 114 でロックされたオブジェクトにアクセスしようとしています。 |
この表で、ブロックしているスレッドの表示順は重要ではなく、コールの順番や時系列を表すものではありません。
開発モードでは、Splunk AppDynamics は java.util.concurrent.locks.ReentrantLock
などの明示的なロックを [Thread Details] コールグラフビューでブロック時間ではなく待機時間として報告します。ビジネストランザクションをモニタリングしてロックの競合に関するパフォーマンスを分析する際には、この点を考慮する必要があります。
サービスエンドポイントでのスレッドの競合
Splunk AppDynamics では、サービス エンドポイント メソッドのスレッドの競合情報を表示できます。サービス エンドポイント メソッドは、コールグラフにアイコン
で表されます。
サービスエンドポイントごとのスレッドの競合情報を表示するには、メニューバーから More > Service Endpoints を選択します。
競合情報のエクスポート
ビジネストランザクションのコールグラフをエクスポートすると、Splunk AppDynamics はトランザクションの競合情報も含めます。
- [Summary] ペインには、[ Block Time] のデータが含まれています。表示されるブロック時間は、コールグラフペインに表示されるブロックされたメソッドの全ブロック時間の合計です。
- コールグラフペインには、メソッドごとのブロック時間が表示されます。