资讯详情

资讯详情

Perfetto 周期性 Trace 快照(Periodic Trace Snapshots)实战指南:环形缓冲区的按需克隆与逐帧分析

Perfetto 周期性 Trace 快照Periodic Trace Snapshots实战指南环形缓冲区的按需克隆与逐帧分析【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto导读在设备或系统参数调优场景中传统的开始采集 → 停止采集 → 拉取文件 → 分析工作流会带来大量不必要的摩擦。Perfetto 的周期性快照Periodic Trace Snapshots方案让你只需启动一次持续运行的环形缓冲区ring buffertrace随后通过--clone-by-name随时克隆出独立的只读快照原始采集会话始终不受干扰地持续运行。读完本文你将掌握在 Android 14 与 Linux 上配置快照采集会话、按名克隆环形缓冲区、用 Trace Processor命令行、Python API分析每次快照以及用 shell 循环实现全自动周期快照的完整技能。适用场景为什么需要周期性快照假设你正在调优设备或系统参数例如写入/proc或/sys节点并希望在数秒内观察到功耗、热温与 CPU 行为的变化。传统工作流的每次启停-拉取-分析都会打断状态、引入时延让迭代变得痛苦。周期性快照把流程简化为只启动一次环形缓冲区 trace永不停止在任意时刻克隆当前缓冲区内容得到该时刻的独立快照原始 trace 继续在后台运行可反复克隆每次克隆后立即用 Trace Processor 分析观察指标随时间的变化。该方案非常适合反复观察系统指标CPU 频率、power rails、温度等且无需每次重启采集。其核心机制从源码看客户端通过--clone-by-name把unique_session_name传给traced服务服务端在 tracing_service_impl.cc 的 FlushAndCloneSession 中先按名字查找会话GetTracingSessionByUniqueName再执行一次隐式 flush 并克隆缓冲区——这就是克隆能拿到最新且完整数据的原因。前置条件Android 端运行Android 14 (U) 或更高版本的设备--clone-by-name需要 Perfetto v49 的客户端与服务端宿主机PATH中存在adb且设备通过 USB 连接宿主机安装trace_processor_shell用于分析下载预编译产物curl -LO https://get.perfetto.dev/trace_processor chmod x ./trace_processorLinux 端安装 Perfetto v49或下载tracebox二进制。tracebox将traced、traced_probes与perfetto客户端打包进单个静态链接可执行文件curl -LO https://get.perfetto.dev/tracebox chmod x tracebox安装trace_processor_shell用于分析下载方式同上访问tracefs以使用 ftrace 类数据源。无需以 root 运行只需把 tracefs 目录所有权交给当前用户sudo chown -R $USER /sys/kernel/tracing第一步启动一个环形缓冲区 trace环形缓冲区的关键配置点是unique_session_name用于后续按名克隆与buffers.fill_policy: RING_BUFFER保证 trace 永不停止。unique_session_name定义于 protos/perfetto/config/trace_config.proto是会话在服务端的全局标识符。Android 配置snapshot_config.pbtxt# 标识本会话稍后可按名克隆。 unique_session_name: my_snapshot # 使用环形缓冲区trace 永不停止。 buffers { size_kb: 65536 fill_policy: RING_BUFFER } # CPU 频率事件驱动 轮询兜底。 data_sources { config { name: linux.ftrace ftrace_config { ftrace_events: power/cpu_frequency ftrace_events: power/cpu_idle ftrace_events: power/suspend_resume ftrace_events: thermal/thermal_temperature ftrace_events: thermal/cdev_update } } } # 周期性 CPU 频率轮询在 ftrace 事件缺失的平台上兜底。 data_sources { config { name: linux.sys_stats sys_stats_config { cpufreq_period_ms: 500 } } } # 电池计数与 power railsPixel 设备。 data_sources { config { name: android.power android_power_config { battery_poll_ms: 1000 battery_counters: BATTERY_COUNTER_CAPACITY_PERCENT battery_counters: BATTERY_COUNTER_CHARGE battery_counters: BATTERY_COUNTER_CURRENT collect_power_rails: true } } }推送配置并启动采集adb push snapshot_config.pbtxt /data/misc/perfetto-configs/ adb shell perfetto -c /data/misc/perfetto-configs/snapshot_config.pbtxt --txt \ --background -o /data/misc/perfetto-traces/snapshot_bg--background会立即返回trace 在设备上持续写入环形缓冲区。Linux 配置snapshot_config.pbtxt# 标识本会话稍后可按名克隆。 unique_session_name: my_snapshot # 使用环形缓冲区trace 永不停止。 buffers { size_kb: 65536 fill_policy: RING_BUFFER } # CPU 频率事件驱动 轮询兜底。 data_sources { config { name: linux.ftrace ftrace_config { ftrace_events: power/cpu_frequency ftrace_events: power/cpu_idle ftrace_events: power/suspend_resume ftrace_events: thermal/thermal_temperature ftrace_events: thermal/cdev_update } } } # 周期性 CPU 频率轮询在 ftrace 事件缺失的平台上兜底如 Intel CPU。 data_sources { config { name: linux.sys_stats sys_stats_config { cpufreq_period_ms: 500 } } } # 电源监控Chrome OS / Linux。 data_sources { config { name: linux.sysfs_power } }启动采集服务并开始追踪。使用tracebox时# tracebox 会自动启动 traced 和 traced_probes。 # --system-sockets 让后续的 clone 命令能够连接到本会话。 ./tracebox --system-sockets -c snapshot_config.pbtxt --txt \ --background -o /tmp/snapshot_bg若分别安装了traced、traced_probes与perfetto# 确保 traced 与 traced_probes 正在运行然后 perfetto -c snapshot_config.pbtxt --txt \ --background -o /tmp/snapshot_bg注意tracebox的--system-sockets标志很关键——它让traced使用系统级 socket后续独立的perfetto --clone-by-name进程才能连接到同一服务并找到该会话。这与 perfetto_cmd.cc 的帮助文本 中--clone-by-name的语义完全对应克隆是按unique_session_name在同一traced服务上查找会话的。第二步按名克隆快照每当你想捕获环形缓冲区的当前状态就按名克隆会话Androidadb shell perfetto --clone-by-name my_snapshot \ -o /data/misc/perfetto-traces/snapshot_1.pftrace这会创建缓冲区内容在该时刻的只读副本原始采集会话继续运行。可以无限次重复每次换不同的输出文件名# 修改系统/设备参数之后…… adb shell perfetto --clone-by-name my_snapshot \ -o /data/misc/perfetto-traces/snapshot_2.pftraceLinuxperfetto --clone-by-name my_snapshot \ -o /tmp/snapshot_1.pftrace # 或使用 tracebox ./tracebox perfetto --clone-by-name my_snapshot \ -o /tmp/snapshot_1.pftrace同样可重复克隆# 修改系统参数之后…… perfetto --clone-by-name my_snapshot \ -o /tmp/snapshot_2.pftrace底层原理克隆在服务端如何工作从源码可以看清克隆的完整链路客户端perfetto --clone-by-name在 perfetto_cmd.cc 中构造CloneSessionArgs填入unique_session_name并通过ConsumerEndpoint::CloneSession发送给traced服务端查找FlushAndCloneSession 按unique_session_name调用GetTracingSessionByUniqueName定位会话找不到则返回Tracing session not found权限校验服务端检查session-IsCloneAllowed(consumer-uid_)不同 UID 的会话默认不允许被克隆返回Not allowed to clone a session from another UID除非该会话标记了bugreport_score 0供 bugreport 场景使用——这一点在单元测试CloneSessionAcrossUidDenied、CloneSessionAcrossUidForBugreport见 tracing_service_impl_unittest.cc中有直接验证隐式 flush克隆前服务端会对所有数据源发起一次Flush(reasonkTraceClone)保证各数据源把已产生的数据提交进缓冲区因此快照不是只读缓冲区拷贝那么简单而是先 flush 再拷贝的一致视图。此外缓冲区还支持两个与克隆相关的进阶选项定义于 trace_config.prototransfer_on_clone克隆时把源会话缓冲区转移给克隆会话并在源会话中分配同尺寸空缓冲区主要支撑 surfaceflinger 快照转储这类一次性大体积 dump避免内存翻倍clear_before_clone配合transfer_on_clone使用在克隆前清空缓冲区避免上一次克隆 flush 的残留数据与新数据混杂。第三步拉取并分析快照拉取快照Android 端adb pull /data/misc/perfetto-traces/snapshot_1.pftrace /tmp/Linux 端快照已在本地文件系统/tmp/snapshot_1.pftrace。使用 trace_processor_shell 查询直接用query子命令执行一次性查询./trace_processor query /tmp/snapshot_1.pftrace INCLUDE PERFETTO MODULE linux.cpu.frequency; SELECT * FROM cpu_frequency_counters LIMIT 100; 或打开交互式 SQL shell 探索数据./trace_processor /tmp/snapshot_1.pftrace几个实用查询CPU 频率INCLUDE PERFETTO MODULE linux.cpu.frequency; SELECT * FROM cpu_frequency_counters LIMIT 100;cpu_frequency_counters表来自 Perfetto SQL 标准库 src/trace_processor/perfetto_sql/stdlib/linux/cpu/frequency.sql它把原始counter表中cpu_frequency类型的 counter track 整理成(cpu, ts, freq)结构其中freq单位为 kHz。Power railsAndroidPixel 设备INCLUDE PERFETTO MODULE android.power_rails; SELECT * FROM android_power_rails_counters LIMIT 100;该视图定义于 src/trace_processor/perfetto_sql/stdlib/android/power_rails.sql由android.power数据源写入的 power rails 计数器派生而来。电池计数器AndroidSELECT ts, t.name, value FROM counter AS c LEFT JOIN counter_track AS t ON c.track_id t.id WHERE t.name GLOB batt.*;温度区域Thermal zonesSELECT ts, t.name, value FROM counter AS c LEFT JOIN counter_track AS t ON c.track_id t.id WHERE t.type thermal_temperature;使用 Python API 查询perfettoPython 包可编程加载 trace 并查询非常适合构建自定义仪表盘或用 Pandas / Polars 做后处理。安装pip install perfetto示例from perfetto.trace_processor import TraceProcessor tp TraceProcessor(trace/tmp/snapshot_1.pftrace) # 以 Pandas DataFrame 查询 CPU 频率。 qr tp.query( INCLUDE PERFETTO MODULE linux.cpu.frequency; SELECT cpu, ts, freq FROM cpu_frequency_counters ) df qr.as_pandas_dataframe() print(df.to_string()) # 绘制每个 CPU 的频率随时间的变化。 import matplotlib.pyplot as plt for cpu, group in df.groupby(cpu): plt.plot(group[ts], group[freq], labelfcpu {cpu}) plt.legend() plt.xlabel(Timestamp (ns)) plt.ylabel(Frequency (kHz)) plt.show()更详细的 Python 用法参见 Trace Processor Python 文档。如需一次分析多个快照Batch Trace Processor 允许你用一条查询跨一组 trace 执行特别适合批量分析周期性快照序列。自动化快照shell 循环一个简单的 shell 循环即可每 N 秒取一次快照并对其执行查询Androidfor i in $(seq 1 10); do SNAP/data/misc/perfetto-traces/snap_${i}.pftrace adb shell perfetto --clone-by-name my_snapshot -o $SNAP adb pull $SNAP /tmp/ echo Snapshot $i ./trace_processor query /tmp/snap_${i}.pftrace INCLUDE PERFETTO MODULE linux.cpu.frequency; SELECT cpu, avg(freq) AS avg_freq_khz FROM cpu_frequency_counters GROUP BY cpu; sleep 5 doneLinuxfor i in $(seq 1 10); do SNAP/tmp/snap_${i}.pftrace perfetto --clone-by-name my_snapshot -o $SNAP echo Snapshot $i ./trace_processor query $SNAP INCLUDE PERFETTO MODULE linux.cpu.frequency; SELECT cpu, avg(freq) AS avg_freq_khz FROM cpu_frequency_counters GROUP BY cpu; sleep 5 done该循环每次迭代输出各 CPU 在快照时间窗内的平均频率配合参数修改前后的对比即可观察调优动作对 CPU 行为的影响趋势。停止采集Androidadb shell killall perfettoLinuxkillall perfetto # 或使用 tracebox 时 killall tracebox限制与注意事项数据源 flush 间隔并非所有数据源都持续输出数据。例如android.power按battery_poll_ms配置的间隔轮询有些数据源仅在 trace 启动或停止时写入数据。快照只会包含截至该时刻已写入环形缓冲区的内容——这解释了为什么克隆前服务端要隐式 flush也提醒你为轮询类数据源设置合理的间隔。环形缓冲区覆盖如果缓冲区相对数据速率太小较旧的数据会在你快照前被覆盖。发现数据空洞时应增大size_kb。克隆可用性--clone-by-name需要 Perfetto v49。Android 上意味着 Android 14 (U) 或更高版本Linux 上请使用较新的tracebox或 Perfetto 构建版本。非实时流每次快照都是缓冲区在某时刻的点拷贝不是实时流。最后一个事件写入与执行 clone 命令之间总存在一定延迟。Linux ftrace 权限Linux 上 ftrace 类数据源需要访问tracefs。与其以 root 运行不如把目录所有权交给当前用户sudo chown -R $USER /sys/kernel/tracing。Intel CPU 频率在大多数现代 Intel CPU 上power/cpu_frequencyftrace 事件不会触发因为频率调节由 CPU 内部管理。应使用带cpufreq_period_ms的linux.sys_stats轮询数据源作为兜底。跨 UID 克隆限制从源码看默认情况下不能克隆其他 UID 启动的会话IsCloneAllowed校验见 tracing_service_impl.cc。在同一 UID 下或使用系统权限运行采集与克隆命令才能保证按名克隆成功。【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →