フレームグラフとは?プロファイリング可視化の解説
フレームグラフは、ネストされた操作の階層全体で時間やリソース使用量がどのように分布しているかを示す可視化で、ボトルネックを視覚的に明白にします。
フレームグラフは、混乱したタイミングデータの山を数秒で読める絵に変えます。もともとはCPUプロファイリングのために発明されましたが、分散トレースを可視化する標準的な方法にもなりました。一度読めるようになれば、コードでもpipelineでも、時間がどこに消えているかを見つけるのは探索ではなく一目の作業になります。
フレームグラフの読み方
フレームグラフでは、各ボックスが操作を表し、その幅がどれだけの時間やリソースを消費したかを表します。幅が広いほど多くを消費しています。ボックスは縦に積み重なってネストを示し、あるボックスはそれを呼び出したボックスの上に乗ります。最も幅の広いボックスが時間の消費先であり、目は自然とボトルネックへ引き寄せられます。
重要なのは幅
重要な読み取りルールは、高さではなく幅がコストを示すということです。高く狭い塔は、時間をほとんど要さない深いネストです。幅の広いボックスは、どれだけ浅くても、多大なリソースを消費しています。最も幅の広いボックスを探すことが、何を最適化すべきかを見つける最速の方法です。
プロファイリングのためのフレームグラフ
本来の用途では、フレームグラフはプロファイラからサンプリングされたstack traceを集約するため、各関数の幅がそれがCPU上にあった頻度を反映します。これによりプログラムのホットパスが即座に見えるようになり、退屈なプロファイラの表を1枚の直感的な絵に置き換えます。
トレースのためのフレームグラフ
同じ形が分散トレースを可視化します。各spanがボックスになり、幅がその継続時間、ネストが親子のspanツリーに従います。トレースのフレームグラフは、遅いリクエストのどのダウンストリーム呼び出しが支配的かを一目で示すため、tracingツールはトレースをこの形でレンダリングします。
CI/CDにおけるフレームグラフ
この考え方をpipelineの実行に適用すると、buildのフレームグラフが得られます。実行がルート、jobとステップがネストされたボックス、幅が実時間です。最も幅の広いステップがbuildの最も遅い部分であり、フレームグラフはpipelineの時間がどこに費やされ、何をまず最適化すべきかを見る直接的な手段になります。
重要なポイント
- フレームグラフは、ネストされた操作全体の時間やリソース使用量を示します。
- 幅がコストを示し、最も幅の広いボックスがボトルネックです。
- CPUプロファイルと分散トレースの両方を可視化します。
- pipelineに適用すると、最も遅いbuildのステップが明らかになります。