Simpleperfによるパフォーマンスのプロファイリング
Simpleperfは、Vegaデバイスにおけるアプリのパフォーマンスを分析するのに役立つ、コマンドラインのネイティブCPUプロファイリングツールです。Simpleperfを使用すると、CPUのボトルネック、過剰なコンテキスト切り替え、非効率的なスレッドスケジューリング、その他のコードレビューだけでは明らかにならない可能性のあるパフォーマンスの問題を特定できます。コア全体のCPU使用パターン、関数呼び出しの頻度と実行時間、ハードウェアパフォーマンスカウンター、プロセススケジューリング動作、コンテキスト切り替えパターンに関する分析情報を提供します。
Simpleperfは、次の2つのモードで動作します。
- [On-device] - 実行中のアプリとシステムアクティビティを監視して、リアルタイムのパフォーマンスデータを収集します。
- [On-host] - デバイス上でこれまでに収集されたデータを処理して表示します。
Simpleperfは、アプリで予期しないフレーム落ち、バッテリー消耗、応答の遅延が発生した場合、またはCPU使用率が想定より高いと疑われる場合に使用します。
Simpleperfを使用するケース
| シナリオ | 推奨ツール |
|---|---|
| GUIによるCPUとメモリのリアルタイム監視 | Activity Monitor |
| ハードウェアカウンターデータ、コールグラフ、またはVega Studioを使用しないプロファイリング | Simpleperf |
| JavaScriptスレッドのパフォーマンスとフレームグラフ | Chrome DevTools |
| 開発中にCPUスパイクを素早く目視確認 | Activity Monitor |
| アプリの起動や特定のネイティブコードパスのプロファイリング | Simpleperf |
前提条件
開始する前に、以下の準備が整っていることを確認してください。
- Vega SDKのインストールが完了していること
- Fire TV StickデバイスがVDA経由で接続されていること
- アプリをデバイス上でビルドして実行していること
Simpleperfのセットアップ
Simpleperfはデフォルトではデバイスイメージに含まれていません。Vega SDKに含まれるバイナリをデバイスにサイドロードする必要があります。
手順1: ビルドバリアントを確認する
デバイスでuser-externalまたはuserビルドバリアントが使用されていることを確認します。どちらのビルドもSimpleperfで機能しますが、user-externalの方が一般的です。
vda shell "cat /etc/os-release | grep BUILD_VARIANT"
想定される出力:
BUILD_VARIANT=user-external
または
BUILD_VARIANT=user
手順2: 開発者モードを有効にする
デバイスで開発者モードを有効にします。
vda shell vsm developer-mode enable
開発者モードの詳細については、開発者モードの有効化を参照してください。
手順3: デバイスに接続してアプリを起動する
デバイスへのシェル接続を開きます。
vda shell
vmsgrを使用してアプリを起動します。以下に例を示します。
vmsgr send "pkg://com.amazondeveloper.mytestapp.main"
手順4: Simpleperfバイナリをデバイスにプッシュする
以下にアクセスしてSDKのSimpleperfバイナリを見つけます。
vega/workspace/env/KeplerCLISimpleperf-1.0/runtime/simpleperf-target/simpleperf
そのバイナリをアプリのスクラッチフォルダにプッシュします。
vda push vega/workspace/env/KeplerCLISimpleperf-1.0/runtime/simpleperf-target/simpleperf tmp/scratch/com.amazondeveloper.mytestapp
出力の例:
developer@bcd07467961e ~ % vda push vega/workspace/env/KeplerCLISimpleperf-1.0/runtime/simpleperf-target/simpleperf /tmp/scratch/com.amazondeveloper.mytestapp
simpleperf: 1 file pushed, 0 skipped.0.1 MB/s (130 bytes in 0.001s)
これで、バイナリがコンポーネントシェルのtmp/scratchフォルダで使用可能になります。
手順5: コンポーネントシェルにアクセスする
ホストマシンで新しいターミナルを開きます。最初のターミナルは手順3のvda shellセッションを実行しているため、別のターミナルが必要です。
コンポーネントシェルに接続します。
vda shell -t component-id com.amazondeveloper.mytestapp.main
バイナリをプッシュしたスクラッチディレクトリに移動します。
cd /scratch
これで、このディレクトリからSimpleperfコマンドを実行できるようになります。
アプリのプロセスIDを確認する
プロファイリングを行う前に、アプリのプロセスID(PID)を確認します。
ps -A
出力の例:
PID TTY TIME CMD
2 ? 00:00:22 mytestapp
66 pts/1 00:00:00 sh
76 pts/1 00:00:00 ps
PID、アプリID、またはpidofでアプリを参照できます。
./simpleperf stat -p 2 # PIDを使用
./simpleperf stat -p com.amazondeveloper.mytestapp # アプリIDを使用
./simpleperf stat -p $(pidof com.amazondeveloper.mytestapp) # pidofを使用
利用可能なイベントの一覧を表示する
simpleperf listを使用して、デバイスがサポートしているイベントを確認します。
# 利用可能なイベントを一覧表示
simpleperf list
# ハードウェアイベントのみを一覧表示
simpleperf list hw
# ソフトウェアイベントのみを一覧表示
simpleperf list sw
他にも、次のようなフィルタリングオプションがあります。
cache- ハードウェアキャッシュイベントraw- 未処理のCPU PMUイベントtracepoint- トレースポイントイベントcs-etm- CoreSight ETMの命令トレースイベントpmu- システム固有のPMUイベント
サポートされている機能をデバイスに表示するには、次のようにします。
simpleperf list --show-features
ハードウェアイベントの出力例:
List of hardware events:
cpu-cycles (Hardware event)
instructions (Hardware event)
cache-references (Hardware event)
cache-misses (Hardware event)
branch-instructions (Hardware event)
branch-misses (Hardware event)
ソフトウェアイベントの出力例:
List of software events:
cpu-clock (Software event)
task-clock (Software event)
page-faults (Software event)
context-switches (Software event)
cpu-migrations (Software event)
minor-faults (Software event)
simpleperf statコマンドやsimpleperf recordコマンドの実行時に、リストされているイベントに-eオプションを指定して使用します。
statによるパフォーマンス統計の収集
simpleperf statを使用して、CPUイベントの集計パフォーマンス統計を収集します。このモードでは、詳細なサンプリングデータによるオーバーヘッドなしに、ハードウェアとソフトウェアのイベントの簡潔な概要を提供します。これは、迅速なパフォーマンス評価や最適化のA/Bテストに役立ちます。
# 特定のプロセスの基本統計収集
simpleperf stat -p <pid>
# 特定のイベントの統計
simpleperf stat -e cache-misses,branch-misses -p <pid>
# カスタム印刷間隔(1000ミリ秒ごと)による統計
simpleperf stat --interval 1000 -p <pid>
# カーネルスペースのみの統計
simpleperf stat -e cpu-cycles:k -p <pid>
# イベントのグループ化による統計
simpleperf stat -e cpu-cycles,instructions -p <pid>
# 固定期間(10秒)の統計
simpleperf stat -p <pid> --duration 10
出力の例:
Performance counter statistics:
1,320,496,145 cpu-cycles # 0.131736 GHz (100%)
510,426,028 instructions #命令あたり2.587047サイクル (100%)
4,692,338 branch-misses # 468.118 K/秒 (100%)
886.008130(ms) task-clock # 0.088390CPU使用 (100%)
753 context-switches # 75.121 /秒 (100%)
870 page-faults # 86.793 /秒 (100%)
Total test time: 10.023829 seconds.
simpleperf stat-a)は、rootアクセス権がある場合のみ利用可能です。stat結果の解釈
出力を解釈するには、次のガイドラインを使用してください。
| 指標 | 意味 | 値が高い場合の対処 |
|---|---|---|
cpu-cycles |
実行されたCPU作業量の合計 | recordでプロファイルしてホット関数を特定します。 |
instructions / cycles per instruction |
CPUの効率 | IPCが低い(命令あたり3サイクルを超える)場合は、メモリスタールや分岐予測ミスが示唆されます。 |
branch-misses |
分岐予測の失敗 | 条件付きロジックを簡素化するか、アクセスパターンが予測しやすくなるようにデータを再構築します。 |
context-switches |
スレッドのプリエンプション頻度 | スレッド数を減らすか、作業をより少ないスレッドにまとめます。 |
page-faults |
ディスクから読み込まれたメモリページの数 | メモリを事前に割り当てるか、ワーキングセットのサイズを小さくします。 |
cache-misses |
CPUキャッシュの非効率性 | データ局所性を改善し、オブジェクト割り当てを減らすか、データレイアウトを再構築します。 |
使用可能なオプションの一覧は、simpleperf help statを実行すると確認できます。
詳細なパフォーマンスデータの記録
simpleperf recordを使用して、事前定義された間隔でCPUイベントをサンプリングすることにより、詳細なCPUパフォーマンス指標を収集します。simpleperfは、記録されたすべてのデータをperf.dataファイルに保存し、後で分析できるようにします。
ユーザースペースのみ(:u)またはカーネルスペースのみ(:k)を監視するよう、イベントの範囲を指定できます。ほとんどの場合、Vegaアプリのプロファイリングでは、ユーザースペースの監視を使用してください。
# 基本的な記録
simpleperf record -p <pid>
# コールグラフによる記録(詳細な分析に推奨)
simpleperf record -e cpu-cycles:u --call-graph dwarf,2048 -p <pid> -- sleep 10
# 特定のイベントを記録
simpleperf record -e cache-misses,branch-misses -p <pid>
# サンプル頻度を上げて(1000サンプル/秒)記録
simpleperf record -f 1000 -p <pid>
# 特定のスレッドを記録
simpleperf record -t <thread_id> -p <pid>
# カーネルスペースイベントを記録
simpleperf record -e cpu-cycles:k -p <pid>
# カスタム出力ファイルに記録
simpleperf record -o custom_output.data -p <pid>
simpleperf record-a)は、rootアクセス権がある場合のみ利用可能です。使用可能なオプションの一覧は、simpleperf help recordを実行すると確認できます。
パフォーマンスデータをホストマシンに転送する方法
コンポーネントシェルは、パフォーマンスデータファイルを/scratchディレクトリに保存します。これらのファイルは、ホストマシン(コンポーネントシェルの外部)でターミナルを開き、次のコマンドを実行すると取得できます。
vda pull /tmp/scratch/com.amazondeveloper.mytestapp/perf.data
/scratchディレクトリは、アプリの再起動中にクリアされることがあります。アプリの起動や再起動の後もパフォーマンスデータを保持したい場合は、データファイルをプルする前に/dataにコピーしてください。レポートによるパフォーマンスデータの分析
ホストマシンでsimpleperf reportを使用して、収集したperf.dataファイルを分析します。次の場所にあるSDKに含まれるホスト版のSimpleperfを使用します。
vega/sdk/<version>/bin/tools/simpleperf
<version>をインストールしたSDKのバージョン(例:0.23.6323)に置き換えます。
# 基本レポートの生成(現行ディレクトリでperf.dataを探す)
simpleperf report
# コールグラフ付きのレポート(データを-gフラグで記録する必要がある)
simpleperf report -g
# 特定のファイルからのレポート
simpleperf report -i perf.data
# カスタムのソート順
simpleperf report --sort comm,pid,tid,dso,symbol
# プロセスで絞り込む
simpleperf report --pids <pid1>,<pid2>
# スレッドで絞り込む
simpleperf report --tids <tid1>,<tid2>
# バイナリで絞り込む
simpleperf report --dsos <バイナリへのパス>
出力の例:
Cmdline: /usr/bin/simpleperf record -e cpu-clock -p 1171 --duration 10
Arch: x86_64
Event: cpu-clock (type 1, config 0)
Samples: 1
Event count: 250000
Overhead Command Pid Tid Shared Object Symbol
100.00% ..pdate-daem:36 1171 2937 /lib/libc.so.6 __errno_location
使用可能なすべてのオプションについて、simpleperf help reportを実行します。
その他のコマンド
simpleperfには、プロファイリング用途に特化した追加のコマンドが含まれています。
| コマンド | 説明 |
|---|---|
debug-unwind |
オフラインスタックアンワインド機能をテストおよびデバッグします。 |
dump |
perf.dataファイルから生データを抽出して表示します。 |
inject |
既存のperf.dataファイルに対してデータを修正または挿入します。 |
kmem |
カーネルのメモリ割り当てパターンを分析します(root権限が必須)。 |
merge |
複数のperf.dataファイルを1つに結合します。 |
monitor |
イベントをリアルタイムで監視し、テキスト形式でstdoutに出力します。 |
report-sample |
perf.dataファイルから未処理のサンプル情報を表示します。 |
trace-sched |
システム全体のプロセスランタイムイベントをトレースします(root権限が必須)。 |
サブコマンドとそのオプションを一覧表示するには、次のようにします。
simpleperf --help
既知の制限事項
Simpleperfはperf_event_paranoidカーネルパラメーターに基づいて操作権限を決定します。デフォルトでは、Vega OSはこの値を2に設定し、セキュリティ上の理由から特定のプロファイリング機能を制限します。
user-externalビルドバリアントで開発者モードが有効になっているデバイスの場合、システムは自動的に値を1に調整します。これにより、より包括的なプロファイリングが可能になります。ただし、権限のないユーザーには引き続き次の操作が制限されます。
- カーネルスペースイベントのプロファイリング
- ハードウェアPMUイベントへのアクセス
- 他のユーザーのプロセスのプロファイリング
- 未処理のトレースポイントイベントの収集
- カーネルコールグラフへのアクセス
- カーネルモードのスタックトレースの収集
ベストプラクティス
データの収集
- 必ず期間を指定するか、制御された方法で終了させます。
- 適切なサンプリング頻度を使用します。
- プロファイリング中にシステム負荷を監視します。
イベントの選択
- 基本的なイベント(
cpu-cycles、instructions)から始めます。 - 同時に発生するハードウェアイベントの数が多くなりすぎないようにします。
- ターゲットデバイスのハードウェア制限を考慮します。
レポート分析
- 複数の実行を比較すると、一貫した結果が得られます。
- 適切なフィルターを使用して結果を絞り込みます。
- 必ずサンプルの欠落がないか確認します。
リソースの管理
- 古い
perf.dataファイルをクリーンアップしてデバイスストレージを解放します。 - サンプリングの頻度を制限してCPUオーバーヘッドを制御します。
例: スクロール中のフレーム落ちの診断方法
このチュートリアルでは、Simpleperfを使用して、コンテンツ一覧のスクロール中にフレーム落ちするアプリを調査する方法を説明します。
1. statで問題を確認する
./simpleperf stat -e cpu-cycles,cache-misses,context-switches -p $(pidof com.amazondeveloper.mytestapp) --duration 5
cpu-cyclesと比較してcontext-switches(500/秒を超える)またはcache-missesの値が高い場合は、調査に値するパフォーマンス上の問題が生じている可能性があります。
2. 問題のあるインタラクション中にコールグラフを記録する
./simpleperf record -e cpu-cycles:u --call-graph dwarf,2048 -p $(pidof com.amazondeveloper.mytestapp) -- sleep 10
10秒間の記録期間中に、コンテンツ一覧をスクロールします。
3. ホストマシン上のデータを取得して分析する
vda pull /tmp/scratch/com.amazondeveloper.mytestapp/perf.data
simpleperf report -g -i perf.data --sort comm,pid,tid,dso,symbol
4. ボトルネックを特定する
Overheadの割合が高い関数を探します。以下に例を示します。
35.2% mytestapp 2 2 libhermes.so hermes::vm::interpretFunction
22.1% mytestapp 2 2 libreact.so facebook::react::ShadowTree::commit
これは、CPU時間の35%がHermesのJavaScriptの実行に、22%がReactのシャドウツリーのコミットに費やされていることを示しています。スクロールハンドラーが1フレームあたりに過剰なJS処理を行っている可能性があります。
5.修正および検証する
最適化(たとえば、スクロールハンドラー内の高コスト計算をメモ化するなど)の後で、同じstatコマンドを再実行し、指標が改善されることを確認します。
関連トピック
Last updated: 2026年6月18日

