as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
Ring
AWS
ドキュメント
Support
Contact Us
My Cases
開発
設計と開発
公開
リファレンス
サポート

Simpleperfによるパフォーマンスのプロファイリング

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.

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 help recordを実行すると確認できます。

パフォーマンスデータをホストマシンに転送する方法

コンポーネントシェルは、パフォーマンスデータファイルを/scratchディレクトリに保存します。これらのファイルは、ホストマシン(コンポーネントシェルの外部)でターミナルを開き、次のコマンドを実行すると取得できます。

vda pull /tmp/scratch/com.amazondeveloper.mytestapp/perf.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-cyclesinstructions)から始めます。
  • 同時に発生するハードウェアイベントの数が多くなりすぎないようにします。
  • ターゲットデバイスのハードウェア制限を考慮します。

レポート分析

  • 複数の実行を比較すると、一貫した結果が得られます。
  • 適切なフィルターを使用して結果を絞り込みます。
  • 必ずサンプルの欠落がないか確認します。

リソースの管理

  • 古い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日