パフォーマンスアナライザー
Linuxデスクトップおよび組み込みデバイス上で、アプリケーションのCPUおよびメモリ使用状況を分析します。
パフォーマンスアナライザーのグローバル設定を行うには、Preferences >Analyzer >CPU Usage に移動します。
特定の実行構成の設定を行うには、Projects >Run Settings に移動し、Performance Analyzer Settings の横にあるDetails を選択します。

現在の実行構成の設定を編集するには、Performance Analyzer ツールバーの [
] の横にあるドロップダウンメニューを選択します。

イベントタイプの選択
イベントテーブルには、パフォーマンスアナライザーによるサンプリングをトリガーするイベントが一覧表示されます。CPU 使用率を分析する最も一般的な方法は、実行された命令数や CPU サイクル数に応じて動作するハードウェア・パフォーマンス・カウンタによる定期的なサンプリングです。また、CPU クロックを使用するソフトウェア・カウンタを選択することもできます。
Add Event を選択して、テーブルにイベントを追加します。[Event Type]で、サンプリングするイベントの一般的なタイプを選択します。最も一般的なのは、hardware またはsoftware です。[Counter]で、サンプリングに使用するカウンターを選択します。たとえば、hardware グループ内のinstructions や、software グループ内のcpu-clock などです。
キャッシュミスやキャッシュヒットなど、より専門的なサンプリングも可能です。ただし、そのサポートは CPU の特定の機能に依存します。これらの専門的なイベントについては、Operation およびResult で、より詳細なサンプリング手順を指定してください。たとえば、読み取り時の L1-dcache ミスをサンプリングするには、load 操作において、結果がmisses となるL1-dcache に対して、cache イベントを選択します。
「Remove Event 」を選択すると、テーブルから選択したイベントが削除されます。
「Use Trace Points 」を選択すると、現在のイベントの選択がターゲットデバイスで定義されたトレースポイントに置き換えられ、「Sample mode 」が「event count 」に、「Sample period 」が「1 」に設定されます。「Create Trace Points 」でターゲット上のトレースポイントが定義されている場合、Performance Analyzer は自動的にそれらを使用してメモリ使用状況をプロファイルします。
「Reset 」を選択すると、イベントの選択が元に戻り、「Sample mode 」および「Sample period 」もデフォルト値に戻ります。
サンプリングモードと期間の選択
「Sample mode 」および「Sample period 」で、サンプルのトリガー方法を指定します。
- event count によるサンプリングでは、選択されたイベントのいずれかが発生するたびに
n回ごとにサンプルを取得するようカーネルに指示します。ここで、nはSample period で設定されます。 - frequency (Hz) によるサンプリングでは、サンプリング間隔を自動的に調整することで、カーネルに対し1秒あたり
n回サンプリングを試行するよう指示します。nはSample period で設定します。
サンプリング頻度が高い場合やイベント数が少ない場合は、より正確なデータが得られますが、その代償としてオーバーヘッドが増加し、生成されるデータ量も増大します。実際のサンプリング周期は、ターゲットデバイス上の Linux カーネルによって決定され、Perf で設定された周期はあくまで目安として扱われます。要求したサンプリング周期と実際の結果との間には、大きな差が生じる可能性があります。
一般的に、Performance Analyzer を、ターゲットとホストデバイス間の接続で送信可能な量よりも多くのデータを収集するように設定すると、Perf がデータを送信しようとしている間にアプリケーションがブロックされ、処理遅延が過度に増加する可能性があります。その場合は、Sample period またはStack snapshot size の値を変更する必要があります。
コールグラフモードの選択
Call graph mode では、Performance Analyzer がアプリケーションからコールチェーンをどのように取得するかを指定できます。
- Frame Pointer または
fpモードは、プロファイル対象のアプリケーションにフレームポインタが存在することを前提としており、各サンプルのコールチェーンを取得するために、ターゲットデバイスのカーネルに対し、フレームポインタのチェーンを辿るよう指示します。 - Dwarf モードは、フレームポインタがなくても動作しますが、生成されるデータ量が大幅に増加します。このモードでは、サンプルがトリガーされるたびに現在のアプリケーションスタックのスナップショットを取得し、そのスナップショットを分析のためにホストコンピュータに送信します。
- Last Branch Record モードはメモリバッファを使用しません。実行が停止するたびに、直近の16個の分岐を自動的にデコードします。このモードは、最新のIntel CPUでのみサポートされています。
Qt やほとんどのシステムライブラリは、デフォルトでフレームポインタなしでコンパイルされるため、フレームポインタモードが有用なのはカスタマイズされたシステムに限られます。
スタックスナップショットのサイズ設定
Performance Analyzerは、Perfがdwarfモードで生成したスタックスナップショットを解析し、展開します。スタックスナップショットのサイズは、Stack snapshot size で設定します。スタックスナップショットが大きいと、転送および処理されるデータ量が増加します。スタックスナップショットが小さいと、高度に再帰的なアプリケーションや、スタックを多用するアプリケーションの呼び出しチェーンを捕捉できない場合があります。
Perf へのコマンドラインオプションの追加
Additional arguments でデータを記録する際に、Perfに渡す追加のコマンドラインオプションを設定します。処理の遅延を軽減するには、--no-delay または--no-buffering を設定します。ただし、これらのオプションはすべてのバージョンのPerfでサポートされているわけではなく、サポートされていないオプションが指定された場合、Perfが起動しない可能性があります。
JIT コンパイルされた JavaScript 関数の名前解決
バージョン 5.6.0 以降、Qt XML は JavaScript 関数に関する情報を含むperf.map ファイルを生成できるようになりました。 Performance Analyzer はこれらのファイルを読み取り、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つの連続するイベント間の遅延を測定するためにも使用できます。最初のイベントの終了位置と2番目のイベントの開始位置の間に範囲を設定します。「Duration 」には、イベント間の遅延がミリ秒単位で表示されます。
イベント範囲を拡大表示するには、その範囲をダブルクリックします。
イベント範囲を削除するには、「Selection 」ダイアログを閉じます。
データの理解
通常、タイムラインビューのイベントは、関数呼び出しに要した時間を示しています。イベントの上にマウスを置くと、詳細が表示されます。 詳細には、常に、関数のアドレス、呼び出しのおおよその所要時間、関数が格納されている ELF ファイル、この関数の呼び出しがアクティブな状態で収集されたサンプル数、スレッド内でこの関数が検出された総回数、およびこの関数が少なくとも 1 回検出されたサンプル数が含まれます。
デバッグ情報が利用可能な関数については、詳細にはソースコード内の位置と関数名が含まれます。このようなイベントを選択すると、コードエディタ内のカーソルを、そのイベントに関連するコードの部分に移動させることができます。
Perf ツールは定期的なサンプルしか収集しないため、Performance Analyzer では、関数が呼び出された正確な時刻や戻り値が返された正確な時刻を特定することはできません。 ただし、各スレッドの 2 行目には、サンプルが取得された正確な時刻が表示されます。Performance Analyzer では、連続する複数のサンプルにおいて、呼び出しチェーンの同じ場所に同じ関数が存在する場合、それはその関数への 1 回の呼び出しを表すとみなします。もちろん、これは単純化された見方です。 また、サンプリングの間に呼び出されている他の関数があっても、それらはプロファイルデータには表示されない場合があります。しかし、統計的には、CPU 時間を最も多く消費している関数がデータ上で最も目立つ形で表示される可能性が高いです。
デバッグ情報を含まない関数が検出された場合、スタックのさらなるアンワインディングに失敗する可能性があります。 アセンブリ言語で実装された一部のシンボルについても、アンワインドは失敗します。アンワインドに失敗した場合、コールチェーンの一部のみが表示され、周辺の関数が中断されたように見えることがあります。これは、アプリケーションの実行中に実際に中断されたことを必ずしも意味するわけではなく、単にアンワインドが失敗したスタック内でそれらの関数が見つからなかっただけであることを示しています。
JIT モードで実行されている QML エンジンの JavaScript 関数は、アンワインド可能です。ただし、その名前はQV4_PROFILE_WRITE_PERF_MAP が設定されている場合にのみ表示されます。 Qt Quick Compiler によって生成されたコンパイル済みJavaScriptもアンワインド可能です。この場合、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を起動し、コールグラフが生成されるようにしてください。また、必要なデバッグシンボルが、標準の場所(/usr/lib/debug またはバイナリファイルの隣)にあるか、あるいは使用しているQtパッケージの一部として、Performance Analyzerから利用可能であることを確認してください。
Performance Analyzer は、フレームポインタモードまたは dwarf モードで生成された Perf データファイルを読み込むことができます。ただし、ファイルを正しく生成するには、数多くの前提条件を満たす必要があります。サポートされている組み込みプラットフォーム用のすべてのシステムイメージは、dwarfモードでのプロファイリング用に正しく設定されています。その他のデバイスについては、記録されたPerfデータファイルに対してperf report またはperf script の出力を確認し、Perfが自身のデータを適切に読み戻せるかどうかを確認してください。
トレースファイルの読み込みと保存
トレースデータは、Performance Analyzer 専用の形式(.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 」ビューには、データを処理するヘルパープログラムからの出力が表示されます。
「Application Output」ビューには、Performance Analyzerにエラーメッセージが表示されている場合でも、一部の情報が表示されます。
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.