使用対象: 

複数のスレッドが同じリソースに同時にアクセスしようとすると、スレッドの競合が生じます。このページでは、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.parkNanos
  • LockSupport.parkUntil
  • LockSupport.park

ビジネス トランザクション フロー マップの [Potential Issues] ペインに、潜在的なスレッドの競合の問題に関するコントローラからの警告が表示されます。ここからブラウザを使用して、ビジネストランザクションまたはサービスエンドポイントのブロックされたスレッドと待機中のスレッドに関する追加情報にアクセスし、パフォーマンス問題の原因を特定できます。  

以下のセクションでは、ブラウザを使用してビジネストランザクションとサービスエンドポイントの競合情報を表示する方法について説明します。

トランザクションスナップショットでのスレッドの競合

スレッドの競合情報を表示するには

  1. トランザクション スナップショットのナビゲーションページで、[Potential Issues] ペインから Thread Contention の問題としてラベル付けされた項目を探します。時間の列には、ブロックされた時間(待ち時間)が表示されます。

  2. ブロックされたメソッドに関する詳細情報を表示するには、スレッドの競合項目をクリックし、[Drill Down into Call Graph.] を選択します。
    コールグラフには、スレッドの競合に関連する次の情報が表示されます。
    • [Call Graph] ヘッダーの [Wait Time] および [Block Time] は、ビジネストランザクションの 1 つのセグメントにおけるスレッドの集約測定値を示します。
    • [Call Graph] ヘッダーの [Node] は、競合するスレッドをホストするノードの名前を指定します(上記の例では PojoNode)。
    • [Time] 列は、メソッドの合計セルフ時間を示します。
    • [Percent%] 列は、メソッドで費やされた時間を、スレッドの全体的な時間の割合として表示します。 
    • [Thread State] 列は、メソッドのスレッド競合問題の程度を示します。灰色は問題なしを意味し、黄色から赤色までの網かけは、競合に関する問題のシビラティ(重大度)を表す。
      (バーの上にマウスを合わせると、スレッドの状態を構成する要素が表示される。これにはデフォルトでブロック時間と待ち時間が含まれる。スレッドの状態の詳細に CPU 時間を含めるには、開発モードを有効にする必要がある。)

  3. ブロック時間または待機時間を示すスレッド状態の任意のメソッドを右クリックし、[View Details.] を選択します。[Thread Contention] 詳細ペインが表示されます。

    [Thread Contention] 詳細ペインでは、ブロックされたメソッドの名前が左上に表示され、[Thread Contention] の表に以下の情報が追加されます。

    エレメント意味
    ブロックしているスレッドブロックしているオブジェクトのロックを保持するスレッド
    ブロックしているオブジェクトブロックされたスレッドがアクセスを待っているオブジェクト。
    ブロック時間オブジェクトへアクセスするための待ち時間合計。
    行番号ブロックされたメソッドで、ブロックしているオブジェクトがアクセスされる行番号。
    上記の例では、run は行 114 でロックされたオブジェクトにアクセスしようとしています。

    この表で、ブロックしているスレッドの表示順は重要ではなく、コールの順番や時系列を表すものではありません。

開発モードでは、Splunk AppDynamicsjava.util.concurrent.locks.ReentrantLock などの明示的なロックを [Thread Details] コールグラフビューでブロック時間ではなく待機時間として報告します。ビジネストランザクションをモニタリングしてロックの競合に関するパフォーマンスを分析する際には、この点を考慮する必要があります。

サービスエンドポイントでのスレッドの競合

Splunk AppDynamics では、サービス エンドポイント メソッドのスレッドの競合情報を表示できます。サービス エンドポイント メソッドは、コールグラフにアイコン で表されます。

サービスエンドポイントごとのスレッドの競合情報を表示するには、メニューバーから More >  Service Endpoints を選択します。 

競合情報のエクスポート

ビジネストランザクションのコールグラフをエクスポートすると、Splunk AppDynamics はトランザクションの競合情報も含めます。 

  • [Summary] ペインには、[ Block Time] のデータが含まれています。表示されるブロック時間は、コールグラフペインに表示されるブロックされたメソッドの全ブロック時間の合計です。
  • コールグラフペインには、メソッドごとのブロック時間が表示されます。