收集和查看轨迹

本页面详细介绍了如何收集 Perfetto 轨迹以供 Wattson 使用,以及如何在 Perfetto 界面中分析生成的能耗数据。

虽然有很多方法可以收集 Perfetto 轨迹,但本页面的方法包含生成与 Wattson 兼容的轨迹的具体要求和工作流程。

最低 build 要求

如需验证 Wattson 是否具有正常运行所需的元数据,您必须从运行最新 build 的设备收集轨迹。CPU 和 GPU 功耗估算的最低 build 版本因设备而异。

设备 最低 build 要求:CPU 估算 最低 build 要求:GPU 估算
Pixel Watch 2 没有最低 build 要求 不支持
Pixel Watch 3 2025 年第 2 季度 不支持
Pixel 6 没有最低 build 要求 2025 年第 2 季度
Pixel 9 2025 年第 2 季度 不支持

通过命令行收集 Perfetto 轨迹

本部分介绍了一个示例工作流,用于收集 Perfetto 轨迹以供 Wattson 使用。以下步骤中列出的所有命令均应从 Android 调试桥 (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 界面收集 Perfetto 轨迹文件

如需使用 Perfetto 界面收集轨迹,您必须为 Wattson 启用特定设置。在 Perfetto 界面中记录新轨迹时,请启用调度详情CPU 频率和空闲状态切换开关:

调度详情以及 CPU 频率和空闲状态切换开关

图 1. 调度详情以及 CPU 频率和空闲状态切换开关。

对于 Pixel 9 设备,在 Ftrace 设置下,选中 devfreq 复选框以启用设备频次收集:

启用设备频次

图 2. 启用设备频次。

使用 Wattson 界面

借助 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 频率翻倍并不一定意味着 CPU 功率或性能翻倍。

与硬件解决方案相比,Wattson 的准确性如何?

我们已将 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"
          }
      }
  }