收集及查看追蹤記錄

本頁面提供詳細操作說明,介紹如何收集 Perfetto 追蹤記錄以搭配 Wattson 使用,以及如何在 Perfetto UI 中分析產生的電量資料。

收集 Perfetto 追蹤記錄的方法有很多種,但本頁的方法包含產生與 Wattson 相容追蹤記錄的特定需求和工作流程。

最低建構需求

如要確認 Wattson 擁有正常運作所需的必要中繼資料,請務必從執行最新版本的裝置收集追蹤記錄。CPU 和 GPU 耗電量估算功能的最低建構版本會因裝置而異。

裝置 最低建構需求:CPU 估算 最低建構需求:GPU 估算
Pixel Watch 2 沒有最低版本需求 不支援
Pixel Watch 3 25Q2 不支援
Pixel 6 沒有最低版本需求 25Q2
Pixel 9 25Q2 不支援

透過指令列收集 Perfetto 追蹤記錄

本節將說明如何收集 Perfetto 追蹤記錄,以供 Wattson 使用。下列步驟中列出的所有指令,都應從 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 追蹤記錄檔案:

    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 頻率和閒置狀態) 切換開關:

排程詳細資料和 CPU 頻率,以及閒置狀態切換開關

圖 1. 排程詳細資料,以及 CPU 頻率和閒置狀態切換開關。

如果是 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 預期會與實驗室的電力測量硬體輸出內容相符嗎?

對於大多數工作負載,Watts 預估值與實驗室電力硬體測量值相符。不過,實際情況並非總是如此,這也不是 Wattson 的用意。

Wattson 的用途是驗證電力改善情形或找出電力回歸,且不會受到環境因素 (溫度)、晶片漏電的單元間變異 (同一 SoC 的漏電量可能因單元而異),或實驗室電力測量硬體間的校準差異影響。

與查看 CPU 時間或 CPU 週期相比,Wattson 有何優勢?

CPU 時間和週期不會計入 CPU 頻率和 CPU 類型 (小、中、大) 之間的電力或能源消耗差異。

CPU 頻率加倍不一定會使 CPU 效能或效力加倍。

與硬體解決方案相比,Watts 準確度如何?

我們已比較 Wattson 與實驗室功率測量硬體,並使用多個團隊提供的多種用途案例。Wattson 的平均誤差為 1 個百分點,標準差為 1.5 個百分點。無論測試時間長短 (從 10 秒到 4 小時),相關性程度都維持不變。因此不會發生錯誤蔓延或錯誤遮蔽等時間因素。

Pixel 6 核心設定實驗

以下是使用 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"
          }
      }
  }