フレームグラフ
Cloud Profiler では、フレームグラフを使用してプロファイリング データが表示されます。フレームグラフでは、ツリーや他のグラフより画面スペースが効率的に使用され、大量の情報がコンパクトで読みやすい形式で表示されます。
このページでは、フレームグラフを導入するためにツリーをフレームグラフに変換する方法を説明するとともに、フレームグラフの特長をまとめています。
フレームグラフの作成
ツリーからフレームグラフを作成する手順は、次の図に示すとおりです。
関数呼び出しを示す矢印をツリーから取り除きます。
ツリーノードを枠に置き換えます。
枠は四角形で、高さはすべて同じです。この例では、枠の名前となっている関数の合計 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 次に、呼び出しシーケンスを保ったまま、枠の間の上下にあるスペースを取り除いて枠を左寄せします。任意でカラーパターンを定義し、それに従って枠を色分けできます。たとえば、枠をパッケージ、合計 CPU 時間、単独 CPU 時間など、さまざまな測定値に応じて色分けできます。
余分な空白を取り除き、単独 CPU 時間で枠を色分けすると、フレームグラフは次のように表示されます。
foo2
で始まるコールスタックがfoo1
の枠に横に表示されていますが、foo1
とfoo2
のコールスタックが保持されています。
概要
上述の簡単な例では、以下の点を表しています。
- フレームグラフはツリーをコンパクトに表現したものであり、枠を上から下にたどっていくことでコールスタックを再現できます。
- 枠には関数の名前が付き、その幅はその関数の合計 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 時間を超えることがないためです。こうした特性によってフレームの形が決まります。
この例では、
foo1
がbar
を呼び出し、foo1
の合計 CPU 時間は、bar
の合計 CPU 時間にfoo1
の単独 CPU 時間を加えた値として定義されます。このため、bar
の合計 CPU 時間がfoo1
の合計 CPU 時間を超えることはありません。