SVG フレーム グラフを使用してアプリケーションのパフォーマンスを視覚化する方法

公開: 2023-02-21

SVGフレーム グラフは、アプリケーションのパフォーマンスを視覚化する優れた方法です。 各関数で費やされた時間を表示することで、コード内で時間がかかりすぎている領域をすばやく特定できます。 SVG フレーム グラフを表示するには、フレーム グラフを生成できるツールを使用する必要があります。 flamegraph.io など、利用可能なオープン ソース ツールが多数あります。 フレーム グラフを生成したら、タグを使用して Web サイトまたはブログに埋め込むことができます。 フレーム グラフを表示するには、Google スプレッドシートなどのツールを使用することもできます。 新しいスプレッドシートを作成し、[挿入] > [画像] を選択して、フレーム グラフの URL を貼り付けるだけです。

フレーム グラフの実行方法

フレーム グラフの実行方法
画像提供: badawi.io

フレーム グラフを実行するには、コンピューターにいくつかのものがインストールされている必要があります。 最初に必要なのは、Google Chrome ブラウザーです。 次に、Flame Graph 拡張機能をインストールする必要があります。 これらの両方をインストールしたら、Google Chrome ブラウザーを開いて、 Flame Graph 拡張ページに移動する必要があります。 そこから、「Create a new Flame Graph」ボタンをクリックする必要があります。 これにより、フレーム グラフを作成する Web サイトの URL を入力する必要がある新しいタブが表示されます。 URL を入力したら、[Create Flame Graph] ボタンをクリックする必要があります。 フレーム グラフが作成されるまで少し時間がかかります。 完了すると、結果が表示されます。

フレーム グラフには、分散されたリクエスト トレースと、リクエストの実行中に発生した各サービス コールの概要が表示されます。 分散トレースのフレーム グラフは、開発者がアプリケーションのボトルネックを特定するのに役立つレイテンシとエラー データを示します。 この記事では、フレーム グラフの解釈方法と例、および分散トレースをトレースするための他の方法について説明します。 Y 軸は、呼び出しスタックの深さ (呼び出しの数) を表示します。 フレーム グラフのスパンをクリックすると、通常、呼び出しに関連する期間とエラーの概要が表示されます。 フレーム グラフの下にあるタブをクリックすると、メトリクス、ログ、ネットワーク パフォーマンス データ、コード ホットスポット、およびその他のコンテキスト情報を見つけることができます。 らせん図は、一連のリングで囲まれた円によって形成されます。 フレーム グラフを使用して、コード プロファイラーからの要求を満たすために使用されるメソッドとコード パスを視覚化できます。 Datadog アプリケーション パフォーマンス モニタリングおよびディストリビューション トレース ツールを使用すると、すべてのサービスにわたるすべてのリクエストのパスを追跡できます。

フレーム グラフを使用すると、開発者はパフォーマンスの問題をすばやく簡単に確認できます

開発者はフレーム グラフを使用して、分散アプリケーションのパフォーマンスを数秒で視覚化できます。 フレーム グラフは、リクエスト トレースをグラフィカルに表示し、アプリケーションで問題が発生した場所を強調表示することで、開発者がパフォーマンスの問題を特定して修正するのに役立ちます。

Flamegraph でどのように検索しますか?

フレームグラフで検索できる方法はいくつかあります。 1 つの方法は、画面の右上にある検索ボックスを使用することです。 この検索ボックスでは、フレームグラフの検索に使用されるキーワードを入力できます。 フレームグラフで検索するもう 1 つの方法は、参照機能を使用することです。 この機能は、画面の左側にあります。 この機能を使用すると、フレームグラフのさまざまなカテゴリを参照できます。

フレーム グラフの出現により、検索が容易になりました。 右側の大きな TCP_send() フレームの下に書き込みコードパスがあります。 強調表示されたフレームの 1 つをクリックすると、なぜこのようなことが起こるのかがわかります。 Tcp_Send は、テストしたサンプルの 59.1% に存在しました。 その他の興味深い用語には、re?cv、spin、copy、x などがあります。

フレームグラフと呼ばれる理由

ビジュアライゼーションを作成するとき、Neelakanth と Roch は完全にランダムな色を使用しました。 CPU が熱くなった (ビジー) ため、最初に暖色のみを選択した理由が説明されました。 フレームに似ているため、フレーム グラフはすぐに人気を博しました。

炎の危険性

燃えるようなイベントは、欲求不満を解消し、活発な議論を開始するための楽しい方法です. また、人間関係の崩壊につながり、人々がバラバラになる可能性もあります。
炎に対処する最善の方法は、炎を無視することです。 誰かが炎を投稿するかもしれません。 あなたはそれを無視するべきです。 応答する必要はありません。 エネルギーを費やす価値はありません。
Flame は楽しいコミュニケーション手段ですが、使い方を誤ると有害な場合もあります。 炎を恐れる必要はありません。 代わりに、それらを避けて落ち着いてください。

フレームグラフを発明したのは誰ですか?

フレーム グラフは、Netflix やその他の業界だけでなく、多くの言語でパフォーマンス分析の重要なツールになっています。 著者の Brendan Gregg がフレーム グラフを作成し、Communications of the ACM の 2016 年 6 月号に掲載されました。


フレーム グラフ ビューア

フレーム グラフ ビューアは、ユーザーがデータをグラフ形式で視覚化できるソフトウェアの一種です。 このソフトウェアは、コンピューターやその他のデバイスの問題のトラブルシューティングによく使用されます。

speedscope を使用して、Web ベースの方法で大規模なパフォーマンス プロファイルを確認できます。 Brendan Gregg による FlameGraphs は、Chrome 開発者ツールのパフォーマンス パネルに触発されました。 システムからのデータはどのサーバーにも渡されず、完全にブラウザー内で実行されます。 Chrome と Firefox はすべてのプラットフォームで動作するはずです (ただし、私は Mac のみをテストしました)。 左側の重いビューでは、シーケンシャルに記録されているかどうかに関係なく、同一のスタックがグループ化されています。 各親のスタックは、最も重いスタックが左側になるように並べ替えられます。したがって、左側のラベルが付けられます。 状況の詳細なビューは、特定の状況で関数呼び出しがいくつあるかという点で、現在の状況を理解するのに役立ちます。

Rudro Samanta は、speedscope を使用して、Xcode を使用してキャプチャされた iOS アプリケーション プロファイルを視覚化しています。 Jest はテスト ケースの記述に使用され、Travis CI はコードの継続的な統合に使用され、Coveralls はテスト カバレッジ レポートに使用され、Parcel はソース コードの変換に使用され、prettier はコードの自動フォーマットに使用されます。 これを達成する 1 つの方法は、speedscope がインポートできるフォーマットの数を増やすことであり、1 つの方法は統合をより緊密にすることです。 私は Speedscope に 9 か月間取り組んできましたが、それを忘れてしまったように感じています。 エンジニアとして、世界中の人々が複雑な問題を解決するのを支援するために、保守しやすく、理解しやすく、有用なシステムとツール セットを作成するよう努めます。 今年は、創造的で共同的なプロジェクトにより多くの時間を割くと思います。

フレームグラフオンライン

フレーム グラフは、プロファイリング データをグラフィカルに表現したもので、通常、ソフトウェア プログラムのパフォーマンス特性を示すために使用されます。 各セクションの高さは、コードの特定のセクションで費やされた時間を表します。 セクションは、呼び出された時期に従って左から右に並べられます。

ツリーやグラフとは異なり、フレーム グラフは大量の情報を小さな形式で表示することにより、画面スペースを効果的に使用します。 ここをクリックすると、ツリーをフレーム グラフに変換する方法と、フレーム グラフの主な機能について学習できます。 フレーム グラフは、プロファイリング データを表示するために Google Cloud Profiler で使用されます。 コール スタックを追跡すると、呼び出し先の合計 CPU 時間が別の呼び出し先の CPU 時間を超えることはできないため、フレームの幅が減少します。 炎の形状は、この動作によって引き起こされます。 フレーム グラフは、余分な空白を削除し、セルフ CPU 時間を使用してフレームに色を付けた後、次のように表示されます。 foo1 と foo2 の呼び出しスタックは保持されていますが、foo2 で始まり foo1 で終わるスタックはフレームの隣に配置されています。

フレーム グラフの作成方法

フレーム グラフを生成するには、まずスタック トレースをサンプリングする必要があります。 これは伝統的に 2 つのタイプに分けられてきました。システム コード パス (JVM GC、syscalls、TCP など) を示す Linux perf などのシステム プロファイルですが、Java プロファイルは示しません。 hprof、lJP、商用プロファイラーなどの JVM プロファイラーが利用可能です。

フレーム チャートとフレーム グラフ

フレーム チャートとフレーム グラフにはいくつかの重要な違いがあります。 通常、フレーム チャートはイベントのタイムラインを示し、フレーム グラフはスタック トレースを示します。 フレーム チャートはパフォーマンスの問題をデバッグするためによく使用されますが、フレーム グラフはパフォーマンス データを視覚化するためによく使用されます。 フレーム チャートは、プログラムがどのように時間を費やしているかを確認する優れた方法です。 ボトルネックがどこにあるか、およびプログラムがリソースをどのように使用しているかを示すことができます。 フレーム グラフは、プログラムがリソースをどのように使用しているかを確認する優れた方法です。

どのコード パスがホットであるか (CPU でビジーであるため) を判断するための粗いが有用な手法として、固定レートでプロファイリングすると良い結果が得られます。 フレーム グラフを使用すると、スタック トレースをサンプリングすることで、ホット コード パスをすばやく特定できます。 私の Linux perf (perf_events) と DTrace の例は、どちらもインストールできるソフトウェアの例です。 FlameGraph はインタラクティブな SVG を生成する Perl ツールで、画像をドラッグ アンド ドロップして詳細を表示できます。 ビジュアライゼーションは、プロファイラーの他のビジュアライゼーションと似ているように見えるかもしれませんが、いくつかの点で異なります。 これは当初、CPU で何がホットなのかを視覚化するために使用されたため、フレーム グラフと呼ばれていました。 新しい Linux カーネルで実行するオーバーヘッドの少ない方法については、eBPF profile(8) セクションを確認してください (eBPF profile(8) は推奨されません)。

perf の詳細については、私の perf_events ページのフレーム グラフのセクションを参照してください。 stackcollapse-perf.pl を使用しないとアクセスできない折り畳みモードを含めることで、折り畳まれた出力を Linux 4.5 パフォーマンス レポートから直接出力することができます。 このサンプルでは、​​ユーザー スタックとカーネル スタック (-f) によって分離されたカーネル (-a) とユーザー (-d) の lint が 99 ヘルツ (-F 99) で提供され、サンプルには 60 秒の時間制限があります。 フレーム グラフは、Fedora 16 で SystemTap v1.7 を使用して生成できます。タイマーは、スタック トレースのサンプリングにも使用できます。 このプロファイル プローブは、システム クロック レート (CONFIG_HZ) で実行されます。 SystemTap は、systemTap アグリゲーション機能を使用してカーネル内でアグリゲートし、(あまり詳細ではない) レポートをユーザーに渡すことができます。

グラフは、Fedora 16 ゲスト (1 つの仮想 CPU) で KVM (Ubuntu ホスト) (32 ビット) を使用して生成されました。 ベア メタルでは、一部のコード パスとサンプル比率が大きく異なります。 プロファイリング データの要素をクリックしてパーセンテージを表示することはできますが (ただし、これは新しいバージョンであるため、クリックしてズームすることはできません)、拡大することはできません。グラフは、Linux の内部構造について詳しく学習するための優れたツールです。 この例では、Illumos カーネル ハイパーバイザー ホストで、ユーザー スタックとカーネル スタックの両方を確認できます。 スタンドアロンの SVG および PNG バージョンも利用できます。 短期間のプロセスの作成にカーネル時間がどのように割り当てられているかを観察するために、このフレーム グラフのワークロードを実行しました。

通常、フレーム グラフは、髪の毛を表示することでカーネル割り込みの負荷を識別するために使用されます。 Ubuntu リリース 1716 の NUMA バランシングは、ノード間のメモリのバランスをとるために CPU サイクルの半分以上を消費し、パフォーマンスが低下します。 フレーム グラフを再生成せずにマージ順序を一定に保つには、D3 でのフレーム グラフの書き換えが不可欠です。 JavaOne 2016 の講演で、フレーム グラフを使用した Linux での Java パフォーマンス分析では、Linux パフォーマンスを使用して混合モードのフレーム グラフを作成するための最新の手法について説明しました。 JDK8u60 には /PreservePointerFrame と呼ばれる機能が含まれており、パフォーマンス グラフとフレーム グラフを生成できます。 JDK-8068945 は、スタック プロファイリング (フレーム ポインター) のホット パッチとして JDK ライブラリに追加されました。 x64 用にコンパイルされたコードで RBP レジスタをフレーム ポインターとして使用すると、適切なフレーム ポインターと見なされます。

DTrace を Jstack メソッドとして実行すると、Java メソッドおよびクラスだけでなく、ユーザーレベルのスタックも追跡できます。 Java プログラムでは、Stackcollapse.pl と flamegraph.pl を使用してCPU フレーム グラフを生成します。 一部の JVM バージョンは、多くの問題がある ustack ヘルパーをサポートしていません。 これは、CPU カウントを含むスタック トレースだけでなく、任意のスタック トレースと値の組み合わせで機能します。 最初の問題は、バグ JDK-6260864 が原因で、Jstack() がスタックを適切にウォークできない可能性があることです。このバグは 2005 年に提出され、2014 年現在も修正されていません。このバグにより、実稼働ワークロードのサンプル スタックの大部分が壊す。 デバイスのメモリ割り当て、デバイス IO、syscall パターン、オフ CPU イベント、および特定の関数呼び出しに関する洞察を得ることができます。 これらのいずれかが使用されている場合、関連する値 (カウント、バイト、またはレイテンシー) でスタック トレースを取得できます。 フレーム グラフは、フレーム グラフ ページでも表示できます。

フレームグラフ Java

フレーム グラフは、ソフトウェア プログラムのパフォーマンスを表すために使用される一種のデータ視覚化です。 プログラムが各関数に費やした時間を示すグラフです。 バーの高さは、プログラムがその関数で費やした時間を表します。 バーの幅は、プログラムがその関数で費やす時間を他の関数と比較して表します。

Java で CPU 使用率を視覚化する新しい方法として、フレーム グラフが最近登場しました。 それらは、Google の軽量 Java プロファイラー (code.google.com) と私のフレーム グラフ ソフトウェア (github) を使用して作成できます。 将来、フレーム グラフが Java プロファイラーとは別の機能でなくなるのは良いことです。 このブログ投稿では、Java のみの JVMTI ベースのメソッドを見ていきます。このメソッドは機能しますが、いくつかの制限があります。 Jeremy Manson は、CPU のサンプリングに使用できる軽量の Java プロファイラーを作成しました。 このサンプル レポートは、Java の起動時から終了するまで生成され、trace.txt ファイルが追加されます。 プログラムを実行するには、いくつかのコストがかかります。

私のプログラムでは、それはマイナーなものでした (リクエスト率がわずか 1% 増加し、CPU 消費量が 7% 増加しました)。 サンプリング レートを下げる必要がある場合は、以降のセクションを参照してください。 flamegraph.pl プログラムの出力は、タイトルを含むさまざまなオプション (list -h) でカスタマイズできます。 同じプロファイリング技法に基づく、Richard Warburton の正直なプロファイラーも役に立ちます。 長期間にわたって大量のデータを収集する場合は、サンプル レートを 100 ヘルツから 50 ヘルツまたはそれ以下に下げることができます。