パフォーマンスアナライザー
Linux デスクトップおよび組み込み機器におけるアプリケーションの CPU 使用率およびメモリ使用率を分析します。
パフォーマンス・アナライザーのグローバルな環境設定を行うには、環境設定>Analyzer >CPU Usage にアクセスしてください。
特定のラン構成に環境設定を設定するには、Projects >Run Settings に進み、Performance Analyzer Settings の横にあるDetails を選択します。

現在のラン構成の設定を編集するには、パフォーマンス・アナライザー・ツールバーの
の隣にあるドロップダウンメニューを選択します。

イベントタイプの選択
イベントの表には、パフォーマンス・アナライザがサンプルを取得するトリガーとなるイベ ントがリストされています。CPU使用率を分析する最も一般的な方法は、実行された命令数またはCPUサイクル数に反応するハードウェア・パフォーマンス・カウンタによる定期的なサンプリングです。CPUクロックを使用するソフトウェア・カウンタを選択することもできます。
Add Event を選択して、テーブルにイベントを追加する。Event Type で、サンプリングされるイベントの一般的なタイプ(最も一般的なのはhardware またはsoftware )を選択します。Counter で、サンプリングのカウンターを選択します。例えば、hardware グループのinstructions や、software グループのcpu-clock などです。
キャッシュ・ミスやキャッシュ・ヒットなど、より特殊なサンプリングも可能です。しかし、そのサポートはCPUの特定の機能に依存します。そのような特殊なイベントについては、Operation とResult で、より詳細なサンプリング指示を与える。例えば、読み出し時のL1キャッシュ・ミスをサンプリングするために、misses の結果を持つload 操作で、L1-dcache のcache イベントを選択する。
選択したイベントをテーブルから削除するには、Remove Event を選択する。
Use Trace Points を選択して、現在のイベントの選択をターゲット・デバイス上で定義されたトレース・ポイントに置き換え、Sample mode をevent count に、Sample period を1 に設定します。Create Trace Points がターゲット上でトレース・ポイントを定義している場合、Performance Analyzerは自動的にそれらを使用してメモリ使用量のプロファイルを作成します。
Sample mode およびSample period と同様に、イベントの選択をデフォルト値に戻すには、Reset を選択します。
サンプリング・モードと周期の選択
Sample mode およびSample period で、サンプリングのトリガー方法を指定します:
- event count によるサンプリングは、選択されたイベントのいずれかが発生した
n回ごとにサンプルを取るようにカーネルに指示します(nはSample period で設定されています)。 - Sampling byfrequency (Hz) は、サンプリング周期を自動的に調整することで、毎秒
n回のサンプリングを試みるようカーネルに指示します。Sample period でnを設定します。
高い頻度または低いイベント数は、高いオーバーヘッドと生成される大量のデータを犠牲にして、より正確なデータをもたらします。実際のサンプリング周期は、ターゲット・デバイス上のLinuxカーネルによって決定され、カーネルは単にアドバイスとしてPerfに設定された周期を使用する。要求したサンプリング周期と実際の結果には大きな違いがあるかもしれない。
一般的に、ターゲットとホスト・デバイス間の接続で送信できる以上のデータを収集するようにパフォーマンス・アナライザーを設定すると、Perfがデータを送信しようとしている間にアプリケーションがブロックされ、処理遅延が過度に大きくなる可能性があります。その場合は、Sample period またはStack snapshot size の値を変更してください。
コールグラフモードの選択
Call graph mode では、パフォーマンス・アナライザがアプリケーションからコール・チェーンを回復す る方法を指定できます:
- Frame Pointer または
fpのモードは、プロファイル化されたアプリケーションで利用可能なフレーム・ポインタに依存し、各サンプルのコール・チェーンを取得するために、ターゲット・デバイス上のカーネルにフレーム・ポインタのチェーンをウォークするように指示します。 - Dwarf モードもフレーム・ポインタなしで動作しますが、生成されるデータは大幅に増えます。サンプルがトリガーされるたびに、現在のアプリケーション・スタックのスナップショットを取得し、そのスナップショットを解析用にホスト・コンピュータに送信します。
- Last Branch Record モードはメモリバッファを使用しません。実行が停止するたびに、最後に取得された 16 個のブランチを自動的にデコードします。最近のIntel CPUでのみサポートされています。
Qtとほとんどのシステム・ライブラリはデフォルトでフレーム・ポインタなしでコンパイルされているので、フレーム・ポインタ・モードはカスタマイズされたシステムでのみ有効です。
スタックスナップショットサイズの設定
Performance Analyzer は、ドワーフモードの Perf によって生成されたスタックスナップショットを解析し、元に戻します。スタック・スナップショットのサイズをStack snapshot size で設定する。スタックスナップショットが大きいと、転送・処理されるデータ量が多くなります。小さなスタックスナップショットでは、高度に再帰的なアプリケーションのコールチェーンや、その他の激しいスタック使用をキャプチャできない可能性があります。
Perf のコマンドラインオプションの追加
Additional arguments でデータを記録する際に、Perf に渡すコマンドラインオプションを追加設定する。--no-delay または--no-buffering を設定すると、処理の遅延を減らすことができます。ただし、これらのオプションは Perf のすべてのバージョンでサポートされているわけではなく、サポートされていないオプションを指定すると Perf が起動しないことがあります。
JIT コンパイルされた JavaScript 関数の名前の解決
バージョン5.6.0以降、QtはJavaScript関数の情報をperf.map 。パフォーマンス・アナライザーはそれを読み込み、Timeline 、Statistics 、Flame Graph のビューに関数名を表示します。これは、プロファイリングされるプロセスがターゲット・デバイス上ではなく、ホスト・コンピュータ上で実行されている場合にのみ機能します。perf.map ファイルの生成をオンにするには、環境変数QV4_PROFILE_WRITE_PERF_MAP をRun Environment に追加し、その値を1 に設定します。
収集したデータの分析
Timeline ビューには、スレッドごとの CPU 使用率のグラフ表示と、記録されたすべてのイベントの凝縮されたビューが表示されます。

タイムラインの各カテゴリは、アプリケーションのスレッドを表している。行のイベント (5) にカーソルを移動すると、そのイベントの所要時間とソースのどの関数を表しているかが表示されます。イベントが選択されているときだけ情報を表示するには、View Event Information on Mouseover (4) をオフにします。
アウトライン (9) は、データが収集された期間を要約します。ズーム範囲 (7) をドラッグするか、アウトラインを選択してアウトライン上を移動します。また、Jump to Previous Event とJump to Next Event (1)を選択することで、イベント間を移動することができます。
Show Zoom Slider ボタン(2)を選択すると、ズーム・レベルを設定するスライダーが開きます。ズームハンドル(8)をドラッグすることもできます。デフォルトのズームレベルをリセットするには、タイムラインを右クリックしてコンテキストメニューを開き、Reset Zoom を選択します。
イベント範囲の選択
イベント範囲(6)を選択して、その範囲を表す時間を表示したり、トレースの特定の領域にズームすることができます。Select Range (3)を選択し、選択ツールを起動します。次に、タイムライン上をクリックして、イベント範囲の始点を指定します。選択ハンドルをドラッグして、範囲の終わりを指定します。
イベント範囲は、2つの後続イベント間の遅延を測定するためにも使用します。Duration 、イベント間の遅延がミリ秒単位で表示されます。
イベント範囲を拡大するには、その範囲をダブルクリックします。
イベント範囲を削除するには、Selection ダイアログを閉じます。
データを理解する
通常、タイムラインビューのイベントは、関数呼び出しにかかった時間を示しています。イベントの上にマウスを移動すると、詳細が表示されます。詳細には常に、関数のアドレス、呼び出しのおおよその時間、関数が存在する ELF ファイル、この関数呼び出しがアクティブな状態で収集されたサンプル数、この関数がスレッド内で遭遇した合計回数、この関数が少なくとも 1 回は遭遇したサンプル数が含まれます。
デバッグ情報が利用可能な関数の場合、詳細にはソースコード内の場所と関数名が含まれます。このようなイベントを選択すると、コードエディターでカーソルをイベントに関連付けられているコード部分に移動させることができます。
Perf ツールは周期的なサンプルのみを収集するため、Performance Analyzer は関数がいつ呼び出され、いつ返されたかを正確に判断することはできません。しかし、各スレッドの 2 行目で、いつサンプルが取得されたかを正確に確認できます。パフォーマンス・アナライザーは、複数の連続したサンプルにおいて、コールチェイン の同じ場所に同じ関数が存在する場合、これはそれぞれの関数への1回のコールを表すと 仮定します。もちろん、これは単純化したものです。また、プロファイルデータには表示されないが、サンプル間で他の関数が呼び出されている可能性もある。しかし、統計的には、最もCPU時間を費やしている関数が最も目立つように表示されます。
デバッグ情報のない関数に遭遇すると、スタックの巻き戻しに失敗することがあります。また、アセンブリ言語で実装されたシンボルでも、巻き戻しに失敗することがある。巻き戻しに失敗すると、コールチェーンの一部だけが表示され、周囲の関数が中断されたように見えることがある。これは必ずしもアプリケーションの実行中に中断されたことを意味するのではなく、巻き戻しに失敗したスタックの中に見つからなかったことを意味します。
JITモードで動作しているQMLエンジンのJavaScript関数はアンワインドできます。ただし、関数の名前が表示されるのはQV4_PROFILE_WRITE_PERF_MAP が設定されている場合のみです。で生成されたコンパイル済みJavaScriptも巻き戻しが可能です。 Qt Quick Compilerによって生成されたコンパイル済みのJavaScriptもアンワインドできます。この場合、JavaScript の関数名ではなく、コンパイラが生成した C++ 名が表示されます。インタープリタモードで実行されている場合、QML を含むスタックフレームもアンワインドされ、インタープリタされた JavaScript ではなく、インタープリタそのものが表示されます。
コールチェーンに含まれるカーネル関数は、各スレッドの3行目に表示されます。
イベントの色付けは、それらが属する特定のスレッドの継続時間にわたる実際のサンプルレートを表しています。Linuxカーネルは、スレッドがアクティブな場合にのみスレッドのサンプルを取得します。同時に、カーネルは要求されたイベント期間を尊重しようとします。したがって、異なるスレッド間のサンプリング頻度の違いは、より多くのサンプルが取られているスレッドが全体的なボトルネックである可能性が高く、より少ないサンプルが取られているスレッドは、I/Oやミューテックスなどの外部イベントを待つために時間を費やしている可能性が高いことを示しています。
統計情報の表示

Statistics ビューは、タイムラインの各関数が、合計で、スタックの一番上にある時に含まれていたサンプル数を表示します(self と呼ばれます)。これにより、どの関数を最適化する必要があるかを調べることができます。発生回数が多い場合、その関数が不必要にトリガーされていたり、実行に非常に時間がかかっている可能性があります。
行を選択すると、コード・エディターのソース・コード内の各関数に移動します。
Callers とCallees ペインには、関数間の依存関係が表示されます。これにより、アプリケーションの内部関数を調べることができます。Callers ペインには、メインビューで選択した関数を呼び出した関数がまとめられています。Callees ペインには、メインビューで選択した関数から呼び出された関数がまとめられています。
行を選択すると、コードエディターのソースコード内の各関数に移動し、メインビューで選択します。
ビューまたは行の内容をクリップボードにコピーするには、コンテキストメニューからCopy Table またはCopy Row を選択します。
統計情報を炎グラフで表示する

Flame Graph ビューは、実行の統計的概要をより簡潔に表示します。横棒は、ある関数のサンプルの側面を、すべてのサンプルの同じ側面と比較して示しています。ネスティングは、どの関数が他の関数から呼び出されたかを示します。
Visualize ボタンを使用すると、Flame Graph で表示するアスペクトを選択できます。
- Samples はデフォルトの可視化です。水平バーのサイズは、与えられた関数について記録されたサンプル数を表します。
- Peak Usage モードでは、横棒のサイズは、割り当てのメモリ使用量がピークに達した時点での、それぞれの関数によって割り当てられたメモリ量を表します。
- Allocations モードでは、横棒のサイズは、各関数によってトリガーされたメモリ割り当ての数を表します。
- Releases モードでは、横棒のサイズは、それぞれの関数によってトリガーされたメモリ解放の数を表しています。
Peak Usage 、Allocations 、Releases の各モードは、メモリー・トレース・ポイントからのサンプルが記録されている場合にのみ、データが表示されます。
ビュー間の相互作用
Timeline,Flame Graph,Statistics のいずれかのビューでスタックフレームを選択すると、それに関する情報が他の 2 つのビューに表示されます。Statistics およびFlame Graph のビューで時間範囲を表示するには、Analyze >Performance Analyzer Options >Limit to the Range Selected in Timeline を選択します。完全なスタックフレームを表示するには、Show Full Range を選択します。
Perf データファイルのロード
Linux Perf ツールの最近のバージョンで生成されたperf.data ファイルをロードし、Qt Creator で表示することができる。ファイルをロードするには、Analyze >Performance Analyzer Options >Load perf.data File を選択します。

Performance Analyzer は、デバッグ・シンボルを見つけるために、データが記録されたコンテキ ストを知る必要があります。そのため、アプリケーションがビルドされたキットと、アプリケー ションの実行ファイルがあるフォルダを指定する必要があります。
Perf データファイルは、perf record を呼び出すことで生成されます。--call-graph オプションを指定して Perf を起動し、データ記録時にコールグラフを生成するようにしてください。また、Performance Analyzer が必要なデバッグシンボルを標準の場所(/usr/lib/debug またはバイナリの隣)か、使用している Qt パッケージの一部として利用できることを確認してください。
Performance Analyzerは、フレームポインタまたはドワーフモードで生成されたPerfデータファイルを読み込むことができます。ただし、ファイルを正しく生成するには、多くの前提条件を満たす必要があります。サポートされている組込みプラットフォーム用のシステムイメージはすべて、ドワーフモードでのプロファイリング用に正しく設定されています。その他のデバイスについては、記録されたPerfデータファイルのperf report またはperf script の出力をチェックすることで、Perfが自身のデータを賢明な方法で読み戻せるかどうかを確認してください。
トレースファイルのロードと保存
トレース・データは、パフォーマンス・アナライザー専用のフォーマット(.ptq)で保存・ロードすることができます。このフォーマッ トは自己完結型であるため、ロードする際に記録環境を指定する必要はありません。このようなトレース・ファイルをツールチェインやデバッグ・シンボルなしで別のコンピュータに転送し、そこで解析することができます。
トレースデータをロードするには、Analyze >Performance Analyzer Options >Load Trace File を選択します。
トレースデータを保存するには、Save Trace File を選択します。
トラブルシューティング
Performance Analyzerは、以下の理由でデータの記録に失敗することがあります:
- Perf イベントがシステムでグローバルに無効になっている。構成済みの Boot to Qtイメージは Perf イベントが有効になっています。カスタム設定を行うには、
/proc/sys/kernel/perf_event_paranoidファイルに2よりも小さい値が含まれていることを確認する必要があります。トレースの記録を最大限に柔軟に行うには、この値を-1に設定します。これにより、未加工のカーネルトレースポイントを使用しても、どのような種類のトレースでも記録できるようになります。Perfイベントを有効にする方法は、Linuxディストリビューションによって異なる。いくつかのディストリビューションでは、root(または同等の)権限で以下のコマンドを実行できる:
echo -e "kernel.perf_event_paranoid=-1\nkernel.kptr_restrict=0" | sudo tee /etc/sysctl.d/10-perf.conf
- ターゲットデバイスとホスト間の接続が、Perf によって生成されるデータを転送するのに十分な速さでない可能性があります。Stack snapshot size またはSample period の設定値を変更してみてください。
- Perfはデータを永久にバッファリングし、決して送信しないかもしれません。Additional arguments に
--no-delayまたは--no-bufferingを追加してください。 - Perfのバージョンによっては、ある最小サンプリング周波数が与えられないと記録を開始しないものがあります。Sample period を1000に設定してみてください。
- デバイスによっては、特にi.MX6ボードでは、ハードウェア・パフォーマンス・カウンターが機能せず、Linuxカーネルがランダムにデータの記録に失敗することがあります。Perfは、サンプルのトリガーにさまざまなタイプのイベントを使用できます。デバイス上で
perf listを実行すると、利用可能なイベントタイプのリストが表示されます。イベントタイプの選択はサンプリングのパフォーマンスと安定性に影響します。cpu-clocksoftwareイベントは、ハードウェア・パフォーマンス・カウンターを使用せず、ソフトウェアからサンプリングを行うため、安全ではあるが比較的低速なオプションである。サンプリングが失敗したら、デバイスを再起動してください。カーネルがパフォーマンス・カウンター・システムの重要な部分を無効にしている可能性があります。 - Perfがインストールされていない可能性があります。インストール方法はLinuxディストリビューションによって異なります。例えば、以下のコマンドを試してみてください:
- Ubuntu 22.04の場合:
sudo apt install linux-tools-$(uname -r) - Debianの場合:
apt install linux-perf
- Ubuntu 22.04の場合:
General Messages ]ビューには、データを処理するヘルパー・プログラムの出力が表示されます。
アプリケーション出力]ビューには、パフォーマンス・アナライザがエラー・メッセージを表示しても、いくつかの情報が表示されます。
How To: Analyze」、「Analyzer」、「Analyzing Code」、「Kits」も参照してください 。
Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.