フレームグラフを理解し、使用する 🔗
AlwaysOn Profilingのフレームグラフを使用して、集約されたスタックトレースを視覚化できます。フレームグラフは、アプリケーションからキャプチャされたすべてのスタックトレースの概要を表すものです。フレームグラフを使用して、パフォーマンスの問題を引き起こしている可能性のあるコード行を発見し、コードに加えた変更が意図した効果を持つかどうかを確認します。
フレームグラフへのアクセス 🔗
インストルメント済みのアプリケーションまたはサービスのフレームグラフには、以下の場所でアクセスできます:
Splunk APMのサービスマップ
トレースウォーターフォールビュー内でスパンの詳細情報を表示しているとき
Splunk APMのランディングページ
Splunk APMでインストルメンテーション済みのアプリケーションまたはサービスのフレームグラフにアクセスするには、サービスを選択し、詳細パネルの AlwaysOn Profiling セクションを選択します。
Splunk APMのトレースウォーターフォールビューでスパンの詳細を表示する際、View in AlwaysOn Profiler を選択すると、そのスパン期間の周辺の10分間のフレームグラフが開きます。
APMのランディングページから AlwaysOn Profiling を選択し、サービスフィルターでサービスを選択することもできます。
注釈
AlwaysOn Profilingセクションが表示されない場合は、AlwaysOn Profilingのトラブルシューティング を参照してください。
フレームグラフを理解する 🔗
AlwaysOn Profilingは、アプリケーションのコードのスナップショット(スタックトレース)を常時取得しています。何千ものスタックトレースに目を通すことは現実的ではないため、AlwaysOn Profilingがプロファイリングデータを集約して要約し、コールスタックの調査のための便利な方法を提供します。
AlwaysOn Profilingのフレームグラフは、関数呼び出し間の階層に従って、すべてのバーを上から下へスタックし、スタックフレームを作成します。最上位のバー(ルートとも呼ばれる)が、コールスタックの開始点です。フレームグラフ内の各スタックの深さは、関数呼び出しのシーケンスを示し、それ以上派生スタックがなくなるまで続きます。フレームグラフでは、スペースを節約するようにバーを並べるので、水平方向の順序はありません。
スタックフレームの解釈 🔗
フレームグラフの各バーは、コード内の関数に関連付けられたスタックフレームです。AlwaysOn Profilingは、一定期間内のすべてのコールスタックを集約することで、スタックフレームを抽出します。複数のスタックトレースが同じフレームで始まると、それらのフレームを表すバーが1つのバーに統合されます。
スタックフレーム内の灰色のバーはシステムレベルのパッケージです。緑のバーはお客様のカスタムコードです。
各バーの幅は、コードのパフォーマンスの重要な指標となります。バー(スタックフレーム)の幅が広いほど、関連する関数がスタックトレースに現れる頻度が高く、そのフレームが他のスタックフレームに比べてより多くのリソースを消費していることを意味する可能性があります。
タイプ |
スタックフレーム幅の意味 |
---|---|
CPU |
関数がスタックトレースに現れる頻度。他のスタックトレースと比較したCPU使用率。 |
メモリ |
他のスタックトレースと比較した、関数が割り当てたメモリ量 |
次の画像は、JavaアプリケーションのCPUスタックフレームを示すものです。
AlwaysOn Profilingのフレームテーブルでは、各スタックフレームに、アプリケーションによって呼び出されたメソッドのクラス名、ファイル名、およびコード行がラベル付けされています。これと同じ情報が、フレームグラフのバーにカーソルを置いた際にも表示されます。フレームを選択するか、フレームにカーソルを置くと、以下の情報が表示されます:
次の画像はスタックフレームを示しており、クラス、ファイル名、コード行がハイライトされています。
フレームテーブルの解釈 🔗
AlwaysOn Profilingのテーブル内で、Count は、ある行がスタックトレース内に何回出現したかを示しています。Self time は、その関数の実行に費やされた時間から他の関数の呼び出しに費やされた時間を差し引いた値を示します。セルフタイムの値が高い場合は、パフォーマンスに問題がある可能性があります。しかし、スレッドがアイドル状態でリソースを消費していないことを意味している場合もあります。以下の画像はフレームグラフを示すものであり、スレッドのフレームテーブルがハイライトされています:
フレームを選択すると、そのコードが存在するコールスタックの量を示す情報ダイアログが表示されます。どのスレッドがコールスタックに寄与したかを見るには、Show Thread Info を選択します。
フレームグラフの検索およびフィルタリング 🔗
スタックフレームの詳細を検索して、探している関数のみを表示することができます。
また、環境別、サービス別、サービスインスタンス別、スレッド状態別にスタックトレースをフィルタリングすることもできます。Linked to Spans を使用してコールスタックを絞り込み、APMがご利用のアプリケーションからスパンを受信している場合のスナップショットのみにフォーカスします。
CPUまたはメモリの表示切り替え 🔗
AlwaysOn Profilingのフレームグラフの表示は、CPU と Memory の間で切り替えることができます。メモリのデータは、メモリのプロファイリングを有効にしている場合のみ表示できます。AlwaysOn Profilingの有効化 を参照してください。
次の画像は、Javaアプリケーションのメモリプロファイリングのフレームグラフを示すものです:
フレームグラフを使用して問題を特定し確認する 🔗
ほとんどの場合、問題のあるスパンやエンドポイントに続いて、または、サービスがCPUやメモリの限界に達したといったインフラストラクチャのパフォーマンス問題を特定した後に、フレームグラフを開きます。アプリケーションのスパンやメトリクスから得られるコンテキストとあわせて、フレームグラフは問題を引き起こしている可能性のあるコード行を特定するのに役立ちます。
フレームグラフの一番上のバーは、最も幅が広く、フレームワークのコードを表すことが多く、トラブルシューティングにはあまり関係がないかもしれません。アプリケーションコンポーネントをハイライトするには、フィルターに関数名やクラス名を入力し、ハイライトされたバーまでスクロールします。各バーを選択して幅を最大にし、その関数から呼び出されるメソッドをドリルダウンします。
各フレームグラフの構造は、プロファイリングデータの量とアプリケーションの動作に依存します。フレームグラフの分かれ目は、データセット内の異なるコードパスを示します。ある関数が他の関数を呼び出すと必ずそのバーの下に複数のバーが表示されます。バーの幅が広いほど、AlwaysOn Profilingがキャプチャしたその関数への呼び出しが多いことを示します。
フレームを調査している際、フレームグラフは、その下に他のフレームを積み重ねることで、その時点からのコードの流れを示します。そのフレームから発生する呼び出しに異常なパターンがあれば、アプリケーションのコードに問題がある、あるいは最適化の機会があることを示唆するものである可能性があります。
フレームグラフを使ったサンプルシナリオについては、Splunk AlwaysOn Profilingを使用したアプリケーションとサービスの監視シナリオ を参照してください。