アプリケーションのトラブルシューティング

Splunk AppDynamics には、アプリケーションに関する問題の診断に役立つ数々のツールとビューが含まれています。

トラブルシューティングへのアクセス

アプリケーションの問題のトラブルシューティングを始める場合、最初に UI の [Troubleshoot] セクションに移動します。アプリケーション コンテキストで、コントローラ UI の左のナビゲーションペインからアクセスできます。

このエリアには、応答遅延、エラーと例外、および正常性ルール違反を分析するためのページが含まれています。また、特定の問題をトラブルシューティングする専用の UI エリアであるウォールームにもアクセスできます。

メモリ量の制限

エージェント 機能
分析エージェント この機能は設定可能であり、ドキュメント化されています。「スタンドアロン Analytics エージェントの有効化」を参照してください。
C/C++ SDK エージェント この機能は設定できません。
データベースエージェント この機能は設定可能であり、ドキュメント化されています。「スタンドアロン Analytics エージェントの有効化」を参照してください。
Go SDK エージェント この機能は設定できません。
IIB エージェント この機能は設定できません。
Java エージェント この機能は設定できません。
マシンエージェント この機能は設定可能であり、ドキュメント化されています。「マシンエージェントの要件とサポートされる環境」を参照してください。
.NETエージェント この機能は設定できません。
ネットワークエージェント この機能は設定できません。
Node.jsエージェント この機能は設定できません。
PHPエージェント この機能は設定できません。
Python エージェント この機能は設定できません。

その他のヘルプ

上記の手順を完了した後も応答遅延が続く場合は、さらに診断を行う必要があります。Splunk AppDynamics ドキュメントで必要な情報が見つからない場合は、コミュニティ掲示板に問題に関するメモを投稿することを検討してください。

応答遅延

正常性ルール違反に基づいた通知を受信する場合は、応答時間が遅いことを示すフローマップやトランザクション スコアカード内のパフォーマンスインジケータを確認してください。その際のトラブルシューティングと診断の戦略について次のガイドラインで説明します。

[Troubleshoot] メニューの [Slow Response Times] ダッシュボードには、平均応答時間(ART)が遅い最大の原因であるビジネストランザクションがリストされます。 そのダッシュボードから、ART のスパイクを中心とした時間範囲を選択できます。これにより、正常に見える時間範囲もキャプチャします。この情報は、[By Contribution to App Average Response Time] タイルの [Top Business Transactions] タブからも入手できます。

ステップ 1:遅いまたは停滞しているビジネストランザクションをチェックします。

Splunk AppDynamicsトランザクションしきい値を使用して、遅い、非常に遅い、および停滞しているトランザクションを検出します。ステップ 2 を完了するかステップ 3 に進むかを判断するには、次の手順を実行します。

遅いまたは停滞しているトランザクションがありますか。

  1. コントローラ UI で選択された時間枠にパフォーマンス問題が発生した時間が含まれていることを確認します。問題が継続している状態の場合は、時間枠を比較的短くすることができます。[Time Range] ドロップダウンを使用します。
  2. [Troubleshoot > Slow Response Times] をクリックします。
  3. [Slow Transactions] タブが選択されていない場合は、クリックします。
  4. このページには、1 つ以上の低速トランザクション スナップショットが表示されますか。
    1. Yes の場合:ステップ 2 に進み、ドリルダウンして根本原因を特定。
    2. No の場合: ステップ 3 に進み、遅いバックエンドについて確認。

ステップ 2:根本原因を特定するために、遅いまたは停滞しているトランザクションを詳しく調べます。

  1. 左メニューから、[Troubleshoot] > [Slow Response Times] の順に移動。
  2. [Slow Transactions] タブの下部ペインで [Exe Time (ms)] 列をクリックし、トランザクションを遅い順にソート。
  3. スナップショットをリストから選択し、[Details] をクリック。
  4. [Potential Issues] リストで、トランザクションで最も実行時間の長いメソッドおよび SQL コールを確認。
  5. 潜在的な問題をクリックし、[Drill Down into Call Graph] を選択するか、トランザクション フローマップ ペインで [Drill Down] をクリックし、このトランザクションにあるコールグラフセグメントの完全なセットを確認。
  6. [Time (ms)] 列で、トランザクション実行時間に対するこのメソッドの実行時間を確認。
  7. 右側の最後の列にある [HTTP] リンクをクリックすると、情報の詳細ペインが表示される。
  8. 実行セグメントにより表されるクラス、メソッド、および行番号(利用できる場合)をメモする。この情報は、このコードの問題をトラブルシューティングするための開始点を示す。
遅いまたは停滞しているトランザクションが複数ある場合は、そのすべてを解決するまでこの手順を繰り返してから、 に進みます。ステップ 3:バックエンドのデータベースまたはリモートサービスコールが低速であるかどうかを確認します。

ステップ 3:バックエンドのデータベースまたはリモートサービスコールが低速であるかどうかを確認します。

Splunk AppDynamics では、インストゥルメント化されたアプリケーションサーバーから、データベースとリモートサーバーへのビジネス トランザクション コールのパフォーマンスに関するメトリックを収集します。データベースやリモートサービスのコールが遅い場合、根本的な原因へドリルダウンすることができます。

  1. Troubleshoot > Slow Response Times の順にクリックし、[Slowest DB & Remote Service Calls] タブをクリックします。
  2. リストからコールを選択し、[View Snapshots] リンクをクリックして、相関スナップショットのリストを表示します。
  3. [Exe Time (ms)] 列をクリックし、トランザクションを遅い順にソートします。
  4. トランザクションを選択して [Drill Down] をクリックします。
  5. [Potential Issues] リストから潜在的な問題を選択します。
  6. [Drill Down into Call Graph] をクリックしてコールグラフの問題点に直接移動するか、フローマップペインで [Drill Down] をクリックし、このトランザクションにあるコールグラフセグメントの完全なセットを確認します。
  7. [Time (ms)] 列を確認し、トランザクション実行時間に対してこのメソッドの実行時間が最長のトランザクションを選択します。
  8. [DB&Remote Service Calls] タブを選択します。
  9. [SQL Calls] または [Remote Service Calls] タブに 1 つ以上の低速コールが表示されますか。
    • Yes の場合:ステップ 4 に進み、ドリルダウンして根本原因を特定。
    • No の場合: ステップ 5 に進み、遅い階層のすべてのノードに問題が影響しているかを確認。

ステップ 4:SQL またはリモートサービスコールを詳しく調べて、根本原因を特定します。

  1. Slow database call:データベースコールをクリックしてコールに関する情報を取得。
    1. Java アプリケーションと Oracle データベース間に Correlated snapshots がある場合は、トランザクション スナップショットで Oracle データベースにドリルダウンし、スナップショット中に取得したデータベースの詳細を表示。
    2. Splunk AppDynamics for Databases を使用している場合は、アプリケーション、階層、ノード、またはバックエンドフローマップでデータベースを右クリックし、[Link to Splunk AppDynamics for Databases] を選択。データベース用 Splunk AppDynamics を使用して、データベース問題を診断。
    3. Database Monitoring を使用している場合は、アプリケーション、階層、ノード、またはバックエンドフローマップでデータベースを右クリックし、[View] を選択してデータベースの問題を確認。トランザクション スナップショットの [SQL Calls] タブで、SQL コールを並べ替える。並べ替え基準は平均。時間(ms)。
  2. [Remote Service Calls] タブでクエリを並べ替える。並べ替え基準は平均時間(ms)。
  3. スローコールを選択。
  4. [Drill Down intoDownstream Call] をクリックして、サービスコールのメソッドに関するインサイトを確認。
  5. [Time (ms)] 列でメソッドを並べ替える。
  6. 遅いメソッドを選択。
  7. [Details.] をクリックします

ステップ 5:この問題は、遅延しているティアのすべてのノードに影響していますか。

  1. アプリケーションまたは階層フローマップで、tier または node アイコンをクリックすると、その階層における各ノードの正常性の概要を表示できます。
  2. 問題は遅延しているティアのすべてのノードに影響していますか?すべてのノードが黄色または赤の場合、この質問の答えは「はい」となります。それ以外の場合は「いいえ」となります。
    • Yes の場合:ステップ 6 に進む。
    • No の場合:ノードのハードウェアまたはノードにおけるソフトウェアの設定方法に問題あり。ティアの中で1つのノードのみに影響がある場合、おそらく問題はアプリケーションのコードに無関係。ハードウェア関連の問題を特定するには、次の手順を実行します。
    1. 左側のナビゲーションウィンドウで、Tiers & Nodes をクリックします。
    2. 右ペインでティアを展開し、影響のあるノードをダブルクリックしてノードダッシュボードを開く。
    3. [Memory] タブをクリック。
      1. 利用可能な各タブを調査し、ノードへのメモリ追加、アプリケーションへの追加メモリ構成、またはその他の処置を行う必要があるかを判断。

    4. [Server] タブをクリックします。
      1. [Hardware] タブがハードウェア関連の問題を示唆している場合は IT 部門に連絡。

問題を特定しました。

ステップ 6:問題がほとんどのビジネストランザクションに影響を与えるかどうかを確認します。

  1. [Application Dashboard] で、画面右側にある [Business Transaction Health] ペインを確認する。
  2. ビジネストランザクションの正常性を示すバーは黄色または赤ですか。「はい」または「いいえ」。
    • No の場合:次の手順を実行。
    • i. 左ナビゲーションウィンドウで、[Business Transactions] をクリック。

      ii. 正常性、トランザクションスコア、または他の列の見出しで並べ替え、問題のあるビジネストランザクションを特定。

      iii. 問題のあるビジネストランザクションをダブルクリックしてダッシュボードを表示し、タブを使用して問題を診断。

問題を特定しました。

エラーと例外

Splunk AppDynamics アプリケーション インテリジェンス プラットフォームは、監視対象環境内におけるビジネス トランザクション エラーに関する情報を取得し提示します。

上位レベルでは、指定したメソッドに基づくカスタムエラーイベントなど、コードレベルの例外またはエラーイベントにより通常の処理が影響を受けた場合に、ビジネストランザクションでエラーが発生したとみなされます。

エラーと例外に関する情報の表示

コントローラUIには、トランザクションスナップショット、メトリック、およびダッシュボードなど、UIのさまざまな場所のエラーおよび例外に関する情報が表示されます。

フローマップ内のティアに関する情報ポップアップには、そのティアのエラー率メトリックを表示するエラータブが含まれています。

エラー率メトリック

アプリケーションおよびティアフローマップでは、エラー率はすべてのビジネストランザクションを対象としています。ビジネストランザクションフローマップでは、エラーは現在のビジネストランザクションのみを対象としています。

メトリックブラウザには Error メトリックが含まれています。

Metric Browser

Troubleshoot > Errors ページにはすべてのエラートランザクションが表示されます。このページには、トランザクションエラーと例外の2つのタブがあります。

これらのタブには、エラーまたは例外の割合に関する情報が表示され、下図に示すようにエラーまたは例外にドリルダウンして詳細情報を確認できます。

例外

ビジネス トランザクション エラー

構成済みのエラー検出ルールに従ってコントローラ UI の選択した時間内で検出されたすべてのトランザクションエラーは、[Errors] ページの [Error Transactions] タブに表示されます。

Splunk AppDynamics のデフォルトでは、トランザクションのコンテキストで以下のいずれかのタイプのイベントが検出された場合に、ビジネストランザクションがエラーであると見なされます。

  • 未処理の例外またはエラー。発生した後キャッチされなかった例外や、ビジネストランザクションの終了後にキャッチされた例外は、トランザクションエラーとなり、Splunk AppDynamics に表示されます。ビジネストランザクションのコンテキスト内で発生しキャッチされた例外はトランザクションエラーとは見なされず、Splunk AppDynamics でキャプチャされません。
  • Web サービスやデータベースコールなどの exit コールでキャッチされた例外。
  • ステータスコード404または500の応答などのHTTPエラー応答。
  • カスタム構成のエラーメソッドおよびエラーメッセージ。

エラー検出の構成については、「エラー検出」を参照してください。

ダウンストリームティアで発生し、発生元のティアに伝播されないエラーはビジネス トランザクション エラーにはなりません。たとえば、発生元のクライアントが 200 Success 応答を受信した場合、ビジネストランザクションはエラーとみなされません。ダウンストリームティアに含まれるエラーは、継続するセグメントの「1 分あたりのエラー数」メトリックにはカウントされます。

ビジネストランザクションにエラーが発生した場合は、エラートランザクションとしてのみカウントされます。トランザクションが遅延または停滞していた場合でも、遅い、非常に遅い、または停滞するトランザクションとしてカウントされません。

でのコードの例外Splunk AppDynamics

ビジネス トランザクション エラーの一般的な原因はコードの例外です。[Errors] ページの [Exceptions] タブには、すべてのトランザクションの例外を集約したビューが表示されます。このビューの目的上、Splunk AppDynamics は以下のインシデントを例外とみなします。

  • 重要度が Error または Fatal である例外(Log4j、java.util.logging、Log4Net/NLog、サポートされているその他のロガーを使用する場合)。これは、ビジネストランザクションのコンテキスト外で発生した場合にも適用され、例外タイプは Application Server であると指定されます。
  • ビジネストランザクションのコンテキストでは発生しないHTTPエラー。
  • エラーページのリダイレクト。

Splunk AppDynamicsビジネストランザクション内で発生し処理される例外については、 はキャプチャせず、[Exceptions] タブにも表示されません。

エラーをトラブルシューティングする際には、ビジネス トランザクション エラーの数が必ずしも特定の時間帯における例外数に対応するとは限りません。エラートランザクションとしてカウントされる単一のトランザクションは、複数の例外に対応する可能性があります。たとえば、トランザクションがティアを横断している場合には、それぞれで例外が生成される可能性があります。通常、エラーのトラブルシューティングを行うには、エラーの起点に最も近い例外を見つける必要があります。

例外のスタックトレースが利用可能な場合は、コントローラ UI の [Exception] タブからアクセスできます。ログをコールする際に例外を渡した場合、その例外に対するスタックトレースを使用できます。たとえば、logger.log(Level.ERROR, String msg, Throwable e)logger.log(Level.ERROR, String msg) の形式のロギングコールにはスタックトレースが含まれますが、 の形式のコールには含まれません。

エージェントのエラー

Javaエージェントでは、エージェントの内部エラーとアプリケーションエラーが区別されます。デフォルトでは、エージェントの内部エラーによって正常性ルール違反が発生することはありません。エージェントの内部エラーは、メトリックブラウザのパス Application Infrastructure Performance > <tier> > Agent > Internal Errors で確認できます。

エラーと例外の上限

Splunk AppDynamics では、登録されたエラータイプの数を(エラーログイベント、例外チェーンなどに基づき)4000 までに制限しています。登録されたエラータイプの統計情報のみが保持されます。

制限に達すると、CONTROLLER_ERROR_ADD_REG_LIMIT_REACHED イベントが生成されます。上限を増やすことは可能ですが、キャプチャする必要がないエラーが無視されるようにデフォルトのエラー検出ルールを絞り込み、エラー登録数を減らすことを推奨します。

詳細については、「エラー検出」でログのエラーと例外を無視する構成に関する情報を参照してください。

エラーと例外の構成

Splunk AppDynamics は、多くの一般的なフレームワークのエラーと例外を自動的に認識します。必要に応じて(たとえば、独自のカスタムエラーフレームワークを使用する場合など)、デフォルトのエラー検出動作をカスタマイズできます。「エラー検出」を参照してください。

.NETの応答遅延

アプリケーションの応答時間が遅いことは、次の方法により気付く場合があります。

  • アラートの受信:正常性ルールとポリシーを使用して構成された Splunk AppDynamics からのメールアラートを受信した場合、そのメールには、アラートを発信する理由となった問題の詳細が記載されています。詳しくは、「通知アクション」の「メール通知」を参照してください。問題が応答時間の遅延に関するものである場合は、「」を参照してください。トラブルシューティング最初の手順
  • アプリケーションダッシュボードでビジネスアプリケーションを表示し、応答時間の遅延を確認。
  • ユーザによる、特定のビジネストランザクションに関する応答時間の遅延報告(たとえば「ホテルの検索が遅い」といった内部テスターのレポートなど)。

トラブルシューティング最初の手順

場合によっては、左側のナビゲーションペインで Troubleshoot > Slow Response Times を選択することで、問題の原因を簡単に診断できることがあります。応答遅延」を参照してください。

.NETリソースのトラブルシューティング

この方法で診断しても問題が見つからない場合は、以下のトラブルシューティング手順を使用して問題の根本的な原因を見つけます。

ステップ1 - CPU飽和の有無

CLRのCPUが飽和状態ですか?

  1. ティアフローマップを表示する。
  2. Nodesタブをクリックし、Hardwareタブをクリックする。
  3. CPU %(現在)で並べ替える。

[CPU %] が 90 以上の場合、ステップ 4 の質問の答えは「はい」となります。それ以外の場合は「いいえ」となります。

「はい」の場合 – ステップ 2 に進む。

「いいえ」の場合 ― メトリックブラウザでさまざまなメトリックを確認して問題を特定。

左側のナビゲーションウィンドウで、Servers > Tiers & Nodes > slow tier をクリックします。次のメトリックを重点的に確認します。

  • ASP.NET -> Application Restarts
  • ASP.NET -> Request Wait Time
  • ASP.NET -> Requests Queued
  • CLR -> Locks and Threads -> Current Logical Threads
  • CLR -> Locks and Threads -> Current Physical Threads
  • IIS -> Number of working processes
  • IIS -> Application pools -> <ビジネスアプリケーション名> -> CPU%
  • IIS -> Application pools -> <ビジネスアプリケーション名> -> Number of working processes
  • IIS -> Application pools -> <ビジネスアプリケーション名> -> Working Set

問題が特定できたので、以下の手順に進む必要はありません。

ステップ2 - 非常に頻繁なガベージコレクションアクティビティの有無

  1. ティアフローマップを表示する。
  2. Nodesタブをクリックし、Memoryタブをクリックする。
  3. Time Spent on Collections (%)で並べ替えると、処理時間におけるガベージコレクションアクティビティが占める割合を確認できます。

[Time Spent on Collections (%)] が許容値を上回る場合(たとえば 40% 以上)、ステップ 5 の質問の答えは「はい」となります。それ以外の場合は「いいえ」となります。

非常に頻繁なガベージコレクションアクティビティがありますか?

「はい」の場合 – ステップ 3 に進む。

「いいえ」の場合 ― 標準ツールを使用してメモリダンプを作成し、それを確認して問題の元を特定。

問題が特定できたので、以下の手順に進む必要はありません。

ステップ3 - メモリリークの有無

メモリリークが発生していますか?

  1. 前の手順で表示されたノードリストから(ガベージコレクションのアクティビティを確認していた時)、非常に頻繁にガベージコレクションアクティビティが発生しているノードをダブルクリックする。
  2. ドロップダウンメニューから [Memory] を選択し、コミット済みバイトカウンタと Gen0、Gen1、Gen2 および大きなヒープのサイズを確認する。

メモリが解放されていない場合(上記のインジケータのうち 1 つ以上が上昇傾向にある)、ステップ 6 の質問の答えは「はい」となります。それ以外の場合は「いいえ」となります。

「はい」の場合 ― 標準ツールを使用して、メモリに関する問題のトラブルシューティングを実行。ASP.NET メトリックの確認も有効(Tiers & Nodes > slow tier > ASP.NET をクリック)。

「いいえ」の場合 ― 標準ツールを使用してメモリダンプを作成し、それを確認して問題の元を特定。

回答が「はい」でも「いいえ」でも、問題が特定されます。

Javaリソースの問題

以下のトラブルシューティングのガイドラインを利用すると、Java に関する多くの問題の根本原因を特定できます。

ステップ1. CPU飽和の有無

JVMのCPUが飽和状態ですか?

確認方法
  1. ティアフローマップを表示する。
  2. [Nodes] タブをクリックし、[Hardware] データを表示する。
  3. CPU %(現在)で並べ替える。
    [CPU %] が 90 以上の場合、この質問の答えは「はい」となります。それ以外の場合は「いいえ」となります。
    • 「はい」の場合 – ステップ 2 に進む。
    • 「いいえ」の場合 – 問題は所属の組織が開発したカスタムの実装に関連している可能性がある。影響を受けたティアまたはノードのスナップショットを取得し、問題解決のために内部のデベロッパと協力する。

ステップ2:非常に頻繁なガベージコレクションアクティビティの有無

非常に頻繁なガベージコレクションアクティビティがありますか?

確認方法
  1. ティアフローマップを表示する。
  2. Nodesタブをクリックし、Memoryタブをクリックする。
  3. [GC Time Spent] で並べ替え、1 分間あたり何ミリ秒が GC に費やされているかを確認する。60,000 が 100% を意味する。
    [GC Time Spent] が 500 ミリ秒以上の場合、ステップ 5 の質問の答えは「はい」となります。それ以外の場合は「いいえ」となります。

ステップ3:メモリリークの有無

メモリリークが発生していますか?

確認方法
  1. 前の手順(ガベージコレクションのアクティビティの確認)で表示されたノードリストから、非常に頻繁にガベージコレクションアクティビティが発生しているノードをダブルクリック。
  2. [Memory] タブをクリックし、スクロールダウンしてパネル下部のメモリプールのグラフを表示する。
  3. [Old Gen memory pools] グラフをダブルクリック。
    メモリが解放されていない場合(使用が上昇傾向にある)、この質問の答えは「はい」となります。それ以外の場合は「いいえ」となります。
    • 「はい」の場合 – 様々な Splunk AppDynamics 機能を使用し、リークを追跡する。メモリリークの診断に便利なツールの1つは、オブジェクトインスタンス追跡。作成しているオブジェクトを追跡でき、必要に応じてそれらが解放されていない理由を判断することができる。オブジェクトインスタンス追跡の構成手順と、メモリリークの発見と修正を行う他のツールへのリンクについては、「Need more help?」を参照。
    • 「いいえ」の場合 – JVMのサイズを増やす。非常に頻繁なガベージコレクションアクティビティがあっても、メモリリークがない場合、コードが実行される十分なヒープサイズを構成していない可能性がある。そのため利用可能なメモリを増やすことで問題が解決される可能性が高い。

    回答が「はい」でも「いいえ」でも、問題が特定されます。

ステップ4. リソースリークの有無

リソースリークが発生していますか?

確認方法
  1. 左ナビゲーションペインで、(たとえば)Metric Browser > Application Infrastructure Performance > TierName > Individual Nodes > NodeName > JMX > JDBC Connection Pools > PoolName の順に移動する。
  2. Active Connections および Maximum Connection メトリックをグラフに追加する。
  3. 必要に応じて、アプリケーションが使用している複数のプールについて繰り返す。
    接続が解放されていない場合(使用が上昇傾向にある)、ステップ 7 の質問の答えは「はい」となります。それ以外の場合は「いいえ」となります。
    • 「はい」の場合 - リソースが作成されているが、必要に応じて解放されていないコード内の場所を特定するために、問題のノードで標準コマンドを使用してスレッドダンプをいくつか取得する。また、Splunk AppDynamics 内で診断アクションを作成することでも、スレッドダンプを作成できる。「診断アクション」の「スレッドダンプアクション」を参照。
    • 「いいえ」の場合 - JVM を再起動する。上記の診断手順で問題が解決しない場合、一度限りの稀な状況の可能性がある。その場合、JVM の再起動で解決する場合がある。

Java メモリリーク

このページでは、Java メモリリークを検出してトラブルシューティングする方法について説明します。
重要: 自動リーク検出を有効にするには、エージェントプロパティの設定権限が必要です。オンデマンド キャプチャ セッションを開始するには、高度なエージェント操作権限が必要です。「Splunk AppDynamics のカスタムロールの管理」を参照してください。
JVM のガベージコレクション機能により、コードベースにメモリリークが発生する機会は大幅に減少します。しかし、ガベージコレクションではメモリリークが完全に除去されないため、Splunk AppDynamics にはサポートされる JVM の自動リーク検知機能が含まれています。

自動リーク検出

ノードダッシュボードの [Memory] タブで [Automatic Leak Detection] にアクセスできます。[Automatic Leak Detection] はデフォルトで無効になっています。これは、JVM のオーバーヘッドが増加するためです。メモリリークの問題が疑われる場合にのみリーク検知モードを有効化してください。リークの原因を特定したら、[Automatic Leak Detection] は無効にします。

自動リーク検知は、On Demand Capture Sessionsを使用して、キャプチャ期間内に積極的に使用されるコレクション(JDK Map または Collection インターフェイスを実装するクラス)をキャプチャします。デフォルトのキャプチャ期間は10分です。

Splunk AppDynamics は、以下の基準を満たすすべての Java コレクションを追跡します。

  • コレクションが少なくとも 30 分間有効である
  • コレクションに少なくとも 1000 個のエレメントがある。
  • コレクションのディープサイズは少なくとも 5 MB。エージェントは、コレクションのすべてのオブジェクトについて再帰的にオブジェクトグラフを横断し、ディープサイズを計算します。

リーク検知基準のデフォルトは、以下のノードプロパティで定義されます。

  • minimum-age-for-evaluation-in-minutes

  • minimum-number-of-elements-in-collection-to-deep-size

  • minimum-size-for-evaluation-in-mb

アプリケーション エージェントのノードプロパティ」を参照してください。

Javaエージェントはコレクションを追跡し、線形回帰モデルを使ってリークの可能性を識別します。一定期間のコレクションへの頻繁なアクセスを追跡することで、リークの根本原因を特定できます。

コレクションが基準を満たすと、Splunk AppDynamics はコレクションのサイズの長期的な成長傾向をモニタリングします。プラスの成長は、コレクションがメモリリークの元である可能性を示しています。

Splunk AppDynamics がリーク元コレクションを特定すると、Java エージェントは 30 分ごとに自動的に診断をトリガーします。診断では、コードパスのシャローコンテンツダンプとアクティビティトレース、およびコレクションにアクセスするビジネストランザクションがキャプチャされます。エージェントによってモニタリングされるリーク元コレクションをドリルダウンすることで、コンテンツサマリキャプチャセッションとアクセストラッキングセッションを手動でトリガーできます。

また、カスタムメモリ構造のメモリリークをモニタリングすることもできます。通常、カスタムメモリ構造はキャッシングソリューションとして使用されます。分散環境では、キャッシングがメモリリークの主な原因になりやすい傾向があります。そのため、こうしたメモリ構造のメモリ統計を管理および追跡することが重要です。それには、事前にカスタムメモリ構造を構成する必要があります。「Javaのカスタムメモリ構造」を参照してください。

メモリリークのトラブルシューティングのワークフロー

次のワークフローを使用して、メモリリークの問題の可能性があると識別された JVM でメモリリークをトラブルシューティングします。

  1. JVM メモリリークの可能性についてメモリをモニタリングする。
  2. 自動リーク検知を有効化する。
  3. オンデマンド キャプチャ セッションを開始する。
  4. リークの状態を検出およびトラブルシューティングする。

JVMリークの可能性があるメモリのモニタリング

[Node] ダッシュボードを使用してメモリリークを特定します。メモリリークの可能性は、ヒープの増加傾向とOld/Tenured世代のメモリプールからわかります。

急激に増加に傾いている場合、オブジェクトは自動的にリークの可能性があるオブジェクトとしてマークされます。

[Automatic Memory Leak] ダッシュボードには、次のものが表示されます。

  • Collection Size:コレクションのエレメントの数。
  • Potentially Leaking:リークしている可能性のあるコレクションは赤で表示される。リークの可能性があるオブジェクトに対して診断セッションを開始する必要がある。
  • Status:診断セッションがオブジェクトで開始された場合に示される。
  • Collection Size Trend:急激に増加に傾いている場合はメモリリークの可能性がある。
ヒント: 長期のコレクションを特定するには、JVMの開始時間とオブジェクト作成時間を比較します。

キャプチャされたコレクションが表示されない場合は、潜在的なメモリリークを検出するための構成が正しいことを確認してください。

メモリリーク検知の有効化

[Automatic Leak Detection] 機能によって、メモリリーク検出を行うことができます。[Automatic Leak Detection] 機能が有効化され、キャプチャセッションが開始されると、Splunk AppDynamics は頻繁に使用されるコレクションをすべて追跡します。そのため、このモードを使用するとオーバーヘッドが大きくなります。

  1. メモリリークの問題が特定された場合にのみ、[Automatic Leak Detection] モードをオンにします。
  2. [Start On Demand Capture Session] をクリックして、頻繁に使用されるコレクションのモニタリングを開始し、リークしているコレクションを検出します。
  3. リークを特定し、解決したら、キャプチャセッションとリーク検知モードをオフにします。
  4. 最適なパフォーマンスを実現するには、1 回につきひとつのコレクションを診断します。

メモリリークのトラブルシューティング

メモリリークの可能性が検出されたら、リークのトラブルシューティングとして次の 3 つのアクションを実行します。

モニタリングするコレクションオブジェクトの選択

[Automatic Leak Detection] ダッシュボードで、クラス名を右クリックし、[Drill Down] をクリックします。

パフォーマンス上の理由から、一度にひとつのコレクションオブジェクトでトラブルシューティング セッションを開始します。

コンテンツ検査の使用

コンテンツ検査は、トラブルシューティングを開始できるように、コレクションがアプリケーションのどの部分に属するかを特定します。特定のコレクションの要素すべてのヒストグラムをモニタリングできます。

オンデマンドキャプチャセッションを開始して自動リーク検知を有効化し、トラブルシューティングを行うオブジェクトを選択して以下の手順を行います。

  1. [Content Inspection] タブをクリックします。
  2. [Start Content Summary Capture Session] をクリックし、コンテンツ検査セッションを開始する。
  3. セッション期間を入力。データ生成に少なくとも1-2分を割り当てる。
  4. [Refresh] をクリックし、セッションデータを取得する。
  5. スナップショットをクリックし、各セッションの詳細を表示する。

アクセストラッキングを使用して、コレクションオブジェクトにアクセスする実際のコードパスとビジネストランザクションを表示します。

上記の「」にあるといて、自動リーク検知を有効化し、オンデマンド キャプチャ セッションを開始し、トラブルシューティングを行うオブジェクトを選択して以下の手順を行います。メモリリークのトラブルシューティングのワークフロー

  1. [Access Tracking] タブを選択。
  2. [Start Access Tracking Session] をクリックし、トラッキングセッションを開始する。
  3. セッション期間を入力。データ生成に少なくとも1-2分を割り当てる。
  4. [Refresh] をクリックし、セッションデータを取得する。
  5. スナップショットをクリックし、各セッションの詳細を表示する。
トラブルシューティング情報ペインには、セッションに関連するJavaスタックトレースが表示されます。デフォルトで、スタックトレースは10行目までの深さで表示されます。キャプチャの行数を一時的に増やす場合は、maximum-activity-trace-stack-depth を使用します。スタックトレースの深さを増やすと、システムリソースが大量に消費される可能性があります。必要な情報をキャプチャした後は、そのプロパティを削除するか、デフォルト値 10 に戻してください。「アプリケーション エージェントのノードプロパティ参照資料」を参照

Javaメモリスラッシング

多数の一時オブジェクトが非常に短い間隔で作成されると、メモリスラッシングが起こります。しのようなオブジェクトは一時的なもので最終的にクリーンアップされますが、ガベージコレクションのメカニズムがオブジェクト作成速度に追いつくことが困難になります。これにより、アプリケーションのパフォーマンスの問題が発生する可能性があります。ガベージコレクションにかかる時間をモニタリングすると、メモリスラッシングなどのパフォーマンスの問題の詳細がわかります。

たとえば、主要なコレクションのスパイク数の増加はJVMの遅延、またはメモリスラッシングの可能性を示しています。オブジェクトインスタンスのトラッキングを使用してメモリスラッシングの原因を特定します。オブジェクトインスタンスのトラッキングを構成して有効化するには、「Javaのオブジェクトインスタンスの追跡」をご参照ください。

Splunk AppDynamics は、上位 20 のコア Java(システム)クラスと上位 20 のアプリケーションクラスのオブジェクトインスタンスを自動的に追跡します。

Object Instance Trackingサブタブには、特定のクラスのインスタンス数と、それらのJVMにおけるオブジェクトのカウントトレンドがグラフで表示されます。また、すべてのインスタンスで使用されるシャローメモリサイズ(オブジェクトのメモリフットプリントとそこに含まれるプリミティブ)が表示されます。

メモリスラッシングの分析

コレクションでメモリスラッシング問題が特定されたら、問題が疑われるクラスにドリルダウンして診断セッションを開始します。

モニターするクラス名を選択し、オブジェクト インスタンス トラッキング ダッシュボード上部にある [Drill Down] をクリックするか、クラス名を右クリックし、[Drill Down] オプションを選択します。

注: 一度にひとつのインスタンスまたはクラス名へのドリルダウンアクションをトリガーすると、最適なパフォーマンス結果を得られます。

ドリルダウンアクションがトリガーされると、オブジェクトインスタンスのデータコレクションが毎分実行されます。このデータコレクションは診断セッションと見なされ、そのクラスのオブジェクト インスタンス トラッキング ダッシュボードのアイコン()が更新され、診断セッションが進行中であることが示されます。

オブジェクト インスタンス トラッキング ダッシュボードは、メモリスラッシングの可能性を示します。オブジェクト インスタンス トラッキング ダッシュボードに表示されるメモリスラッシング問題の主な指標は以下のとおりです。

  • Current Instance Count:大きな数は、数多くある一時オブジェクトの割り当ての可能性を示す。
  • Shallow Size:クラスのすべてのインスタンスが使用する大まかなメモリ。シャローサイズが大きいとメモリスラッシングの可能性がある。
  • Instance Count Trend:のこぎり状の波型はメモリスラッシングを示す。

この時点でメモリスラッシングの問題が疑われる場合は、そのことを確認する必要があります。「メモリスラッシングの確認」を参照してください。

メモリスラッシングの確認

モニターするクラス名を選択し、オブジェクト インスタンス トラッキング ダッシュボードの上部にある [Drill Down] をクリックします。[Object Instance Tracking] ウィンドウで、[Show Major Garbage Collections] をクリックします。

インスタンス数がガベージコレクションのサイクルによって変わらない場合、メモリスラッシングの問題ではなくリークの可能性があります。Java メモリリークJava メモリリーク

割り当てトラッキングを使用した Java メモリスラッシングのトラブルシューティング

割り当てトラッキングは、特定のクラスのインスタンスを割り当てるすべてのコードパスとビジネストランザクションを追跡します。そして、インスタンスを作成および破棄するコードパス/ビジネストランザクションを検出します。

割り当てトラッキングを使用するには、次の手順を実行します。

  1. [Drill Down] オプションを使用し、診断セッションをトリガーする。
  2. Allocation Trackingタブをクリックする。
  3. [Start Allocation Tracking Session] をクリックし、コードパスとビジネストランザクションのトラッキングを開始する。
  4. セッション期間を入力し、データ生成に少なくとも1~2分を割り当てる。
  5. [Refresh] をクリックし、セッションデータを取得する。
  6. セッションをクリックし、詳細を表示する。
  7. Code PathsとBusiness Transactionパネルに表示されている情報を使用して、メモリスラッシングの問題の根源を特定する。

Javaオブジェクトインスタンスのモニタリング

アプリケーションが(JDK ではなく)JRE を使用している場合、以下の手順でオブジェクト インスタンス トラッキングを有効にします。

  1. tools.jar ファイルが jre/lib/ext ディレクトリにあることを確認する。
  2. ノードダッシュボードで [Memory] タブをクリック。
  3. [Memory] タブで、[Object Instance Tracking] サブタブをクリック。
  4. [On]、[OK] の順にクリック。
Javaのオブジェクトインスタンスの追跡Javaのオブジェクトインスタンスの追跡

Javaのコードデッドロック

デフォルトで、Java エージェントはコードデッドロックを検出します。イベントリストまたはREST APIを使用してデッドロックを見つけ、詳細を確認できます。

コードデッドロックとその原因

マルチスレッドの開発環境では通常複数のロックを使用します。しかし、デッドロックが発生することがあります。考えられる原因を次に示します。

  • ロックの順番が最適でない
  • コールされるコンテキストが正しくない(たとえば、コールバック内)
  • 2つのスレッドがお互いにイベントの知らせを待機している可能性がある

イベントリストを使用したデッドロックの検出

イベントリストにコードデッドロックを表示するには、[Filter By Event Type] リストで [Code Problems](または [Code Deadlock])を選択します。

コードデッドロックを検証するには、イベントリストのデッドロックイベントをダブルクリックし、コードデッドロックの [Summary] タブをクリックします。デッドロックの詳細が [詳細(Details)] タブに表示されます。 イベントのモニタリングイベントのモニタリング

REST API を使用したデッドロックの検出

Splunk AppDynamics REST API を使用して、DEADLOCK イベントタイプを検出できます。詳細については、「イベントデータの取得」の例を参照してください。

スレッドの競合

複数のスレッドが同じリソースに同時にアクセスしようとすると、スレッドの競合が生じます。このページでは、Splunk AppDynamics を使用してスレッドの競合の問題を診断および解決する方法について説明します。

スレッドの競合により生じるパフォーマンスの問題

マルチスレッド プログラミング手法は、非同期処理を必要とするアプリケーションで一般的に使用されています。このようなアプリケーションでは、各スレッドに固有のコールスタックがありますが、スレッドからロック、キャッシュ、カウンタなどの共有リソースにアクセスしなければならないこともあります。「スレッド相関の有効化」を参照してください。

このような場合、同期の手法を使ってスレッドの干渉を防ぐこともできますが、今度はスレッドどうしが共有リソースへのアクセスを奪い合う場合があります。その結果、アプリケーション パフォーマンスの低下やデータ整合性の問題が発生する可能性があります。

Splunk AppDynamics では、ビジネストランザクションとサービスエンドポイントのスレッドの競合に関する問題を特定して解決できます。Javaのマルチスレッドトランザクションのトレース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 AppDynamics開発モードでは、 は などの明示的なロックを [Thread Details] コールグラフビューでブロック時間ではなく待機時間として報告します。ビジネストランザクションをモニタリングしてロックの競合に関するパフォーマンスを分析する際には、この点を考慮する必要があります。

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

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

サービス端末ごとのスレッドの競合情報を表示するには、メニューバーから [More] > [Service Endpoints] の順に選択します。

競合情報のエクスポート

ビジネストランザクションのコールグラフをエクスポートすると、Splunk AppDynamics はトランザクションの競合情報も含めます。
  • [Summary] ペインには、[Block Time] のデータが含まれています。表示されるブロック時間は、[CallGraph] ペインに表示されるブロックされたメソッドの全ブロック時間の合計です。
  • コールグラフペインには、メソッドごとのブロック時間が表示されます。

Node.jsでのイベントループのブロック

ループプロセススナップショットを使用してNode.jsのイベントループアクティビティを調べ、イベントループをブロックしているCPU時間が長い関数を特定できます。

Node.jsイベントループの待機時間

Node.js プロセスのイベントループは、着信接続をポーリングし、すべてのアプリケーションコードを実行する単一スレッドです。Node.js リクエストによって外部データベース、リモートサービス、またはファイルシステムが呼び出されると、イベントループはアプリケーションの制御フローを他のタスク(他の接続やコールバックを含む)に自動的に割り当てます。

CPU集約型オペレーションはイベントループをブロックするため、イベントループで受信リクエストの処理や既存のリクエストの完了ができなくなります。あるビジネストランザクションの CPU 集約型オペレーションによって、別のビジネストランザクションで遅延が発生する可能性があります。

AppDynamicsのプロセススナップショット

プロセススナップショットは、インストゥルメント化されたNode.jsノードにおけるCPUプロセスのインスタンスを表します。これにより、構成可能な時間範囲におけるNode.jsプロセスの、プロセス全体のフレームグラフが生成されます。

プロセススナップショットは、プロセススナップショットの期間中にすべてのビジネストランザクションで発生した Node.js イベントループを可視化します。プロセススナップショットは、待機時間の原因が別のビジネストランザクションに含まれる CPU 集約型オペレーションであるために、主なトラブルシューティング ツール(ビジネス トランザクション スナップショットなど)で結論が得られない場合に便利です。プロセススナップショットのリストを使用して、CPU 時間の長いプロセスを特定できます。CPU をブロックしているコードの関数を正確に特定するプロセススナップショットをリストから選択し、調査できます。

特定の Node.js ノードまたはティアに関して、ノードまたはティアダッシュボードの [Process Snapshots] タブからプロセススナップショットのリストを確認できます。プロセス スナップショット リストにフィルタを使用して、必要なスナップショットのみを表示することも可能です。実行時間、スナップショットがアーカイブ済みかどうか、リクエストの GUID により絞り込むことができます。ティアダッシュボードからリストにアクセスする場合は、ノードごとにフィルタを使用できます。

プロセススナップショットの生成方法と構成方法については、「Node.jsプロセススナップショットの管理」を参照してください。

プロセススナップショットとビジネス トランザクション スナップショットの作成方法については、「」を参照してください。

プロセススナップショットは、通常14日間有効です。アーカイブすると永久に閲覧可能になります。

プロセススナップショットには、以下のタブが含まれます。

  • 概要
  • Flame Graph
  • Call Graph
  • Allocation Call Graphs
  • Hot Spots

概要

スナップショットの概要です。コンテンツは表示可能な情報により異なります。

通常、少なくとも実行時間合計、プロセスのティアとノード、タイムスタンプ、最も遅れているメソッドおよび要求GUIDが含まれます。

Flame Graph

プロセススナップショット期間中のCPUに対する各スタックフレームの頻度を可視化します。最底部のスタックに対するフレームの相対的な位置は、コールスタックの深さを表しています。

フレームグラフには、コールグラフと同じ情報が含まれていますが、他のメソッドより多くのCPUリソースを消費しているメソッドをすばやく特定できます。

フレームグラフの上端にあるスタックフレームに対応するメソッドは、メソッドの CPU リソースの消費頻度を表します。

長時間の CPU 実行を特定するには、フレームグラフの上端にある水平方向に長いセルを探します。

正常な Node.js プロセスでは、CPU をブロックするアクティビティが最小限です。これに対応して、正常な Node.js プロセスのフレームグラフには、上端に沿って水平方向の長さが最小限のセルが表示されます。「https://queue.acm.org/detail.cfm?id=2927301Flame Graph」を参照してください。

Call Graph

合計実行時間と、プロセスのコールスタックにある各メソッドの合計実行時間における割合を示します。メソッドの最後にある数字は、ソースコードの行番号です。一定時間以下のメソッドをフィルタリングしてグラフを単純化し、問題点を特定することができます。

[Time] および [Percentage] の列で、実行に最も時間がかかるコールを特定できます。

コールの詳細は、コールを選択して [Details] をクリックすると確認できます。

Allocation Call Graph

手動で収集されたプロセススナップショットでのみ利用可能です。「Node.js プロセススナップショットの管理」を参照してください。

プロセススナップショット中にプロセスのコールスタックにある各メソッドにより割り当てられたメモリ容量とその割合、および開放されなかったメモリ容量とその割合を示します。[Method Size] スライダーを使用して、割り当てコールグラフに表示するためにメソッド内に割り当てが必要なメモリ容量を構成できます。また、特定のメモリ容量を消費するメソッドをフィルタリングしてグラフを単純化し、問題点を絞り込むことができます。

[Size] および [Percentage] の列で、最も多くのメモリを消費しているコールを特定できます。

エージェントは、割り当てスナップショット開始前に行われた割り当てを報告することはできません。

スナップショットで報告される割り当ては、スナップショットの終了時にまだ参照されているメモリです。スナップショット期間中に割り当てられるメモリ容量からスナップショット期間中に開放されるメモリ量を引いた値となります。

コールの詳細は、コールを選択して [Details] をクリックすると確認できます。

Hot Spots

このタブには、最も高価なコールを先頭にして実行時間の順にコールが表示されます。下のパネルで単一コールの呼び出しに関する追跡情報を表示するには、上のパネルでコールを選択します。

右上の [Method Time] スライダーを使用して、コールがホットスポットと見なされる速度を構成します。

Node.jsプロセススナップショットの管理

このページでは、プロセススナップショットの生成および表示の方法について説明します。

プロセススナップショットの自動生成

定期的収集または診断セッションによりビジネストランザクションスナップショットがトリガーされる場合は、10秒間のプロセススナップショットが自動的に開始します。デフォルトでは、エージェントが自動的に1分につき2つ以上のプロセススナップショットを開始することはありませんが、この動作は構成可能です。

必要に応じてプロセススナップショットを手動で開始することも可能です。「プロセススナップショットの手動収集」を参照してください。

自動収集の構成

プロセススナップショットの自動収集は、次の設定を利用して構成します。

  • processSnapshotCountResetPeriodSeconds:自動プロセス スナップショット カウントが 0 にリセットされる頻度(秒単位)。デフォルトは 60 秒です。
  • maxProcessSnapshotsPerPeriodprocessSnapshotCountResetPeriodSeconds の秒数で許可される自動プロセススナップショットの数。デフォルトは 2 スナップショットです。
  • autoSnapshotDurationSeconds:自動生成されるプロセススナップショットの時間。デフォルトは 10 秒です。

この設定を構成するには、「Node.js エージェントのインストール」に記載されているアプリケーション ソースコードの require ステートメントに追加します。その後、アプリケーションを停止して再起動します。

プロセススナップショットの手動収集

プロセススナップショットをすぐに生成するには、手動で開始します。

  1. ダッシュボードで、プロセススナップショットを収集するティアとノードを選択。
  2. [Process Snapshots] タブをクリック。
  3. [Collect Process Snapshots] をクリックします。
  4. [Tier] ダッシュボードの場合は、スナップショットを取得するノードを [Node] ドロップダウンから選択。[Node] ダッシュボードの場合は、そのノードのスナップショット収集のみ設定可能。
  5. このノードのプロセススナップショットを収集する秒数を入力。最大値は 60 秒。
  6. Create をクリックします。
エージェントにより、構成した時間のプロセススナップショットが収集されます。手動で開始したプロセススナップショットには、スナップショットで記録された期間内に割り当てられたメモリおよび解放されなかったメモリを示すコールグラフの割り当てが含まれます。

プロセススナップショットおよびビジネストランザクションスナップショット

このページでは、によって作成されるトランザクション スナップショットとプロセススナップショットの関係について説明します。

V8サンプラー

Node.jsは、コードサンプラーを含むV8 JavaScriptエンジンで構築されています。

は、V8 サンプラーを使用して、Node.js プロセスのコールスタック上にあるメソッドのコールグラフを含むプロセス全体のプロセススナップショットを作成します。

スナップショットのコールグラフデータ

コールグラフデータは、ビジネス トランザクション スナップショットおよびプロセススナップショットに表示されます。

ビジネストランザクションスナップショットを表示すると現れるコールグラフは、そのトランザクションインスタンスに特有のもので、同時に行われるプロセススナップショットのコールグラフから派生しています。

プロセススナップショットを表示すると、プロセススナップショットがキャプチャされている間に実行中のすべてのビジネストランザクションの完全なコールグラフを確認できます。

ビジネストランザクションスナップショットのコールグラフには、特定のビジネストランザクションに起因するメソッドだけを表示するようにフィルタリングした、並行プロセススナップショットからのデータが表示されます。これは、並行プロセススナップショットコールグラフのサブセットです。

このため、ビジネストランザクションコールグラフのメソッド実行時間は、並行プロセススナップショットコールグラフの同じメソッドの実行時間よりも短い場合があります。これは、そのメソッドへの呼び出しがトランザクションスナップショットによりキャプチャされたビジネストランザクションインスタンスのコンテキスト以外で行われたことを示します。

トランザクションスナップショットの概要タブには、トランザクションスナップショットの対象期間中に取得されたプロセススナップショットへのリンクが含まれています。

ビジネストランザクションによりトリガーされるプロセススナップショット

現在のプロセスで既存のプロセススナップショットが進行中でない場合、定期的収集または診断セッションによりトリガーされるビジネス トランザクション スナップショットが開始されるたびに、エージェントが 10 秒間のプロセススナップショットを開始します。これは、ビジネス トランザクション スナップショットに関連するコールグラフデータを提供するためです。プロセススナップショットが重複することはありません。定期的収集とは、定期的な間隔でビジネストランザクションを収集することを意味します。間隔はデフォルトで 10 分ですが、構成することも可能です。診断セッションとは、パフォーマンスの問題の可能性があるパターンを検出したためエージェントによりトランザクション スナップショットのキャプチャが自動的に開始すること、あるいは同じ理由で手動により診断セッションを開始することです。

並行ビジネストランザクションとプロセススナップショット

表示される結果は、ビジネストランザクションと同時に実行されるプロセススナップショットです。2つのスナップショットがどの程度並ぶかは、トランザクションおよびプロセススナップショットの相対的な継続時間と開始時間によります。

下図のシナリオでは、青色で示される 5 秒間のトランザクションコールのすべてと、緑色で示される 10 秒間のトランザクションコールのほとんどが 10 秒間のプロセススナップショットによりキャプチャされますが、オレンジ色の 14 秒間のトランザクション スナップショットのコールは約半分となります。

ビジネストランザクションとプロセススナップショット

ビジネストランザクションがプロセススナップショットより長く実行される場合は、autoSnapshotDurationSeconds でプロセススナップショットのデフォルト時間を増やせます。