トレースを収集して表示する

このページでは、Wattson で使用する Perfetto トレースを収集し、Perfetto UI で結果の電力データを分析するための詳細な手順について説明します。

Perfetto トレースを収集する方法は数多くありますが、このページの方法には、Wattson と互換性のあるトレースを生成するための具体的な要件とワークフローが含まれています。

をご覧ください。

最小ビルド要件

Wattson が正しく機能するために必要なメタデータを持っていることを確認するには、最近のビルドを実行しているデバイスからトレースを収集する必要があります。CPU と GPU の電力推定の最小ビルド バージョンはデバイスによって異なります。

デバイス 最小ビルド要件: CPU の見積もり 最小ビルド要件: GPU の推定
Google Pixel Watch 2 最小ビルド要件なし サポート対象外
Google Pixel Watch 3 25Q2 サポート対象外
Google Pixel 6 最小ビルド要件なし 25Q2
Google Pixel 9 25Q2 サポート対象外

コマンドラインから Perfetto トレースを収集する

このセクションでは、Wattson で使用する Perfetto トレースを収集するワークフローの例を示します。次の手順に記載されているコマンドはすべて、Android Debug Bridge(adb)ホストから発行されることを想定しています。

  1. デバイスに Perfetto 構成ファイルを作成して、トレースを構成し、開始します。構成例は、ソースツリーの wattson.cfg にあります。

    構成には、次のトレース イベントが含まれている必要があります。

    # Polls CPU freq/idle state at the start of trace
    data_sources: {
       config {
          name: "linux.sys_stats"
          sys_stats_config {
             # Large period so polling doesn't happen continuously
             # Intent is just to poll once upfront
             cpufreq_period_ms: 100000000
             cpuidle_period_ms: 100000000
          }
       }
    }
    data_sources: {
       config {
          name: "linux.ftrace"
          ftrace_config {
             ftrace_events: "devfreq/devfreq_frequency"
             ftrace_events: "cpuhp/cpuhp_enter"
             ftrace_events: "cpuhp/cpuhp_exit"
             ftrace_events: "cpuhp/cpuhp_multi_enter"
             ftrace_events: "power/cpu_frequency"
             ftrace_events: "power/cpu_idle"
             ftrace_events: "power/suspend_resume"
          }
       }
    }
    
  2. L3 キャッシュのエネルギー使用量の推定値を有効にするには、fttrace/print イベントを有効にします。

    adb shell perfetto --txt -c /data/misc/perfetto-configs/wattson.cfg --background-wait -o /data/misc/perfetto-traces/trace
    
    # Optional
    adb shell simpleperf stat -a -e arm_dsu_0/l3d_cache/,arm_dsu_0/bus_access/ --interval 10
    
  3. (省略可)Wattson ウィンドウの開始を設定します。これは、記録の開始を示す Perfetto トレースに埋め込まれたマーカーです。このマーカーは、Wattson の測定精度を高めます。

    # Optional
    adb shell "echo 'I|0|wattson_start' >/sys/kernel/tracing/trace_marker"
    
  4. 対象のワークロードを実行します。

  5. (省略可)ftrace/print トレース イベントを有効にして、Wattson ウィンドウの終了を設定します。

    # Optional
    adb shell "echo 'I|0|wattson_stop' >/sys/kernel/tracing/trace_marker"
    
  6. トレース バッファをフラッシュして、Perfetto トレース ファイルを pull します。

    adb shell killall -w perfetto
    adb pull /data/misc/perfetto-traces/trace my_perfetto_trace.pb
    

Perfetto UI を使用して Perfetto トレースを収集する

Perfetto UI を使用してトレースを収集するには、Wattson の特定の設定を有効にする必要があります。Perfetto UI で新しいトレースを記録するときに、[Scheduling details] と [CPU frequency and idle states] の切り替えを有効にします。

スケジューリングの詳細と CPU の周波数とアイドル状態の切り替え

図 1. スケジューリングの詳細と CPU の周波数とアイドル状態の切り替え。

Google Pixel 9 デバイスの場合、[Ftrace] 設定で [devfreq] チェックボックスをオンにして、デバイスの周波数の収集を有効にします。

デバイスのフリークエンシーを有効にする

図 2. デバイスのフリークエンシーを有効にします。

Wattson UI を使用する

Perfetto では、期間を選択してレールごとの統計情報を表示することで、Wattson の電力推定値を分析できます。また、特定のトレース構成を有効にして、スレッド、プロセス、パッケージ レベルで電力消費量を特定することもできます。

レールごとの内訳を表示する

Perfetto で Wattson を操作するには:

  1. Perfetto でトレースを開きます。

    デバイスが Wattson でサポートされている場合、Wattson トレースは自動的にリストされます。

    Perfetto で Wattson トレースを表示する

    図 3. Perfetto で Wattson トレースを表示します。

  2. [Wattson] をクリックして展開し、仮想レールの内訳を表示します。

    • すべてのレールグラフは、レール間の比率を示すために同じ値に自動的にスケーリングされます。

    • 統計情報は、ユーザーが選択(またはマーク)した地域ごとに生成されます。

    • 統計情報テーブルは、列名をクリックすると並べ替えることができます。

    • 推定値の合計は、列タイトルのすぐ下に表示されます。

    鉄道の見積もり

    図 4. 鉄道の見積もり。

スレッド、プロセス、パッケージごとのトレースの帰属を表示する

スケジューラ トレースが有効になっていて、Perfetto でスレッド スライスを確認できる場合は、スレッドレベルまたはプロセスレベルの電力またはエネルギーの帰属も取得できます。

  1. Perfetto で、スレッド スライスのリージョンを選択します。
  2. スレッド、プロセス、パッケージの内訳を表示します。

レールごとのトラック統計情報と同様に、列名をクリックすると、その列で並べ替えることができます。

スレッドレベルの内訳を分析する

基本的な電力推定の最小要件に加えて、スレッド単位の電力帰属を行うには、wattson.cfglinux.ftrace セクションに次の構成を追加する必要があります。

data_sources: {
    config {
        name: "linux.ftrace"
        ftrace_config {
            ftrace_events: "sched/sched_switch"
        }
    }
}

スレッドレベルの内訳

図 5. スレッド レベルの内訳。

プロセスレベルの内訳

プロセスレベルのアトリビューションでは、Perfetto トレースで収集されたデータに対して process_states を有効にする必要があります。wattson.cfg 構成ファイルで次のデータソースを有効にします。

data_sources: {
    config {
        name: "linux.process_stats"
        target_buffer: 1
        process_stats_config {
            scan_all_processes_on_start: true
        }
    }
}

プロセス別の内訳

図 6. プロセス別の内訳。

パッケージ レベルの内訳

パッケージ レベルのアトリビューションでは、Perfetto トレースで収集されたデータで android.packages_list が有効になっている必要があります。wattson.cfg 構成ファイルで次のデータソースを有効にします。

data_sources {
  config {
    name: "android.packages_list"
    target_buffer: 1
  }
}

スレッドレベルとプロセスレベルのアトリビューションと同様に、スレッド スライスの範囲を選択した場合は、パッケージレベルの内訳を確認します。

スレッドレベルの内訳

図 7. スレッドレベルの内訳。

よくある質問

以下に、Wattson に関するよくある質問をいくつかご紹介します。

Wattson はラボの電力測定ハードウェアの出力と一致することが想定されていますか?

ほとんどのワークロードでは、Wattson の推定値はラボの電力ハードウェアの測定値と一致します。ただし、必ずしもそうとは限りません。また、Wattson の目的もそうではありません。

Wattson は、環境要因(温度)、チップ リークのユニット間ばらつき(同じ SoC でもユニットごとにリークが異なる)、ラボの電力測定ハードウェア間のキャリブレーションの違いによるノイズを除去して、電力の改善を検証したり、電力の回帰を検出したりすることを目的としています。

CPU 時間や CPU サイクルを調べるよりも Wattson が便利なのはなぜですか?

CPU 時間とサイクルは、CPU 周波数と CPU タイプ(リトル、ミッド、ビッグ)間の電力またはエネルギー消費量の違いを考慮していません。

CPU 周波数を 2 倍にしても、CPU の電力やパフォーマンスが 2 倍になるとは限りません。

Wattson はハードウェア ソリューションと比較して正確ですか?

Wattson とラボの電力測定ハードウェアを、複数のチームから提供された複数のユースケースで比較しました。WattsOn の平均誤差は 1% ポイント、標準偏差は 1.5% ポイントです。このレベルの相関関係は、10 秒間のテストから 4 時間実行されるテストまで、すべてのテストで維持されます。そのため、時間の経過とともにエラーが増加したり、エラーが隠蔽されたりすることはありません。

Google Pixel 6 のカーネル設定テスト

Google Pixel 6 を使用した Wattson の一般的な内訳のベースライン テストは次のとおりです。

Wattson.cfg

このセクションでは、Perfetto で Wattson を有効にする場合の一般的な構成について説明します。

  write_into_file: true
  flush_period_ms: 30000
  file_write_period_ms: 30000

  buffers: {
      size_kb: 2048
      fill_policy: RING_BUFFER
  }
  buffers: {
      size_kb: 200000
      fill_policy: RING_BUFFER
  }

  # Needed for process level power attribution
  data_sources: {
      config {
          name: "linux.process_stats"
          target_buffer: 0
          process_stats_config {
              scan_all_processes_on_start: true
          }
      }
  }

  # Needed for package level power attribution
  data_sources: {
      config {
          name: "android.packages_list"
          target_buffer: 0
      }
  }

  # Needed for determining CPU freq/idle initial state
  data_sources: {
      config {
          name: "linux.sys_stats"
          sys_stats_config {
              cpufreq_period_ms: 100000000
              cpuidle_period_ms: 100000000
          }
      }
  }

  # Needed for estimating power and thread level power attribution
  data_sources: {
      config {
          name: "linux.ftrace"
          target_buffer: 1
          ftrace_config {
              # Minimum data sources for estimating power
              ftrace_events: "power/cpu_frequency"
              ftrace_events: "power/cpu_idle"
              ftrace_events: "power/suspend_resume"
              ftrace_events: "cpuhp/cpuhp_enter"
              ftrace_events: "cpuhp/cpuhp_exit"
              ftrace_events: "cpuhp/cpuhp_multi_enter"
              ftrace_events: "devfreq/devfreq_frequency"

              # Needed for Wattson start/stop markers
              ftrace_events: "ftrace/print"

              # Needed for thread level power attribution
              ftrace_events: "sched/sched_switch"

              # Needed for process level power attribution
              ftrace_events: "sched/sched_process_free"
              ftrace_events: "task/task_newtask"
              ftrace_events: "task/task_rename"
          }
      }
  }