フレームグラフ

Cloud Profiler では、フレームグラフを使用してプロファイリング データが表示されます。フレームグラフでは、ツリーや他のグラフより画面スペースが効率的に使用され、大量の情報がコンパクトで読みやすい形式で表示されます。

このページでは、フレームグラフを導入するためにツリーをフレームグラフに変換する方法を説明するとともに、フレームグラフの特長をまとめています。

フレームグラフの作成

ツリーからフレームグラフを作成する手順は、次の図に示すとおりです。

フレームグラフの作成

  1. 関数呼び出しを示す矢印をツリーから取り除きます。

  2. ツリーノードを枠に置き換えます。

    フレームは四角形で、高さはすべて同じです。この例では、フレームの名前となっている関数の合計 CPU 時間によって、そのフレームの幅が決まっています。

    各関数の疑似コードを次の表に示します。関数の実行時に処理された CPU 使用率の高い作業によって、単独 CPU 時間が決まります。

    関数の疑似コード 単独 CPU 時間
    (秒)
    合計 CPU 時間
    (秒)
    
    func main():
         foo1()
         foo2()
         // CPU intensive work
         // for 2 seconds 
    2 4 + 3 + 2 = 9
    
    func foo1():
         bar()
         // CPU intensive work
         // for 1.5 seconds 
    1.5 2.5 + 1.5 = 4
    
    func foo2():
         bar()
         // CPU intensive work
         // for 0.5 seconds 
    0.5 2.5 + 0.5 = 3
    
    func bar():
         // CPU intensive work
         // for 2.5 seconds
    2.5 2.5

  3. 次に、呼び出しシーケンスを保ったまま、枠の間の上下にあるスペースを取り除いて枠を左寄せします。任意でカラーパターンを定義し、それに従って枠を色分けできます。たとえば、枠をパッケージ、合計 CPU 時間、単独 CPU 時間など、さまざまな測定値に応じて色分けできます。

    余分な空白を取り除き、単独 CPU 時間でフレームを色分けすると、フレームグラフは次のように表示されます。

    フレームグラフの詳細な図

    foo2 で始まるコールスタックが foo1 のフレームに横に表示されていますが、foo1foo2 のコールスタックが保持されています。

概要

上述の簡単な例では、以下の点を表しています。

  • フレームグラフはツリーをコンパクトに表現したものであり、枠を上から下にたどっていくことでコールスタックを再現できます。
  • フレームには関数の名前が付き、フレームの幅はその関数の合計 CPU 時間の測定値に相対した長さになります。この例では、foo2 の合計 CPU 時間は main の 1/3 であるため、foo2 のフレームの幅も main のフレームの 1/3 になります。
  • フレームの下にある空スペースの幅は、そのフレーム名になっている関数の単独 CPU 時間の測定値に相対した長さです。たとえば、フレーム foo1 の下の 1.5 単位分は空であり、2.5 単位分は bar が占めています。したがって、foo1 の単独 CPU 時間はその合計 CPU 時間の 37.5%(1.5 秒)です。
  • コールスタックを下にたどると、フレームの幅は短くなっていきます。呼び出し先関数の合計 CPU 時間が呼び出し元関数の合計 CPU 時間を超えることがないためです。こうした特性によってフレームの形が決まります。

    この例では、foo1bar を呼び出し、foo1 の合計 CPU 時間は、bar の合計 CPU 時間に foo1 の単独 CPU 時間を加えた値として定義されます。このため、bar の合計 CPU 時間が foo1 の合計 CPU 時間を超えることはありません。

次のステップ