在演示perfetto之前,需要介绍一下perfetto的数据处理过程,这样就能够清晰的了解如何抓取trace。
Perfetto 通过生产者消费者模型来抓取数据,其设计的架构可以分为三个层次(消费者/Tracing 服务/生产者):

Producer 是追踪数据的来源,每个 Producer 可以注册一个或多个 Data Source(数据源)。Producer 通过 UNIX socket 连接到 traced 服务,并在追踪会话期间将数据直接写入共享内存缓冲区。
traced_probes 是 Perfetto 最重要的内置 Producer,负责采集系统级数据:
| 数据源名称 | 功能 | 采集方式 |
|---|---|---|
linux.ftrace | 内核 ftrace 事件 | 读取 tracefs |
linux.sys_stats | 系统统计信息 | 读取 /proc/stat 等 |
linux.process_stats | 进程统计信息 | 读取 /proc/[pid]/stat |
linux.system_info | 系统信息 | 读取 /proc/cpuinfo 等 |
例如

通过配置data source可以自定义一个数据源,例如

Producer 与 traced 之间的数据传输使用了共享内存缓冲区(Shared Memory Buffer, SMB):

工作流程:
这种设计的优势:
Consumer 是追踪会话的发起者和控制者,负责:
TraceConfig(追踪配置)例如有如下消费者
bashperfetto -c config.pbtx --txt -o trace.perfetto-trace
TraceManager 系统服务traced 是整个追踪系统的中枢,主要职责包括:
管理追踪会话的完整生命周期:

traced 管理两种缓冲区:
追踪缓冲区支持两种填充策略:
protobufbuffers { size_kb: 65536 fill_policy: RING_BUFFER # 环形缓冲,覆盖旧数据 # fill_policy: DISCARD # 满了就丢弃新数据 }
traced 收到 TraceConfig 后,将其中的 DataSourceConfig 分发给对应的 Producer:
protobufdata_sources { config { name: "linux.ftrace" # 路由到 traced_probes target_buffer: 0 ftrace_config { ftrace_events: "sched/sched_switch" } } } data_sources { config { name: "track_event" # 路由到 SDK Producer target_buffer: 1 } }
注意:traced 不解码 DataSourceConfig 的内容,只是将原始二进制 blob 转发给匹配的 Producer。这意味着可以引入新的数据源而不需要修改 traced。

不同数据源可以路由到不同的缓冲区,避免高频数据源挤占低频数据源的空间:
protobuf# 缓冲区 0:高频数据(ftrace),需要较大空间 buffers { size_kb: 131072 fill_policy: RING_BUFFER } # 缓冲区 1:低频数据(进程统计),较小空间即可 buffers { size_kb: 8192 fill_policy: RING_BUFFER } data_sources { config { name: "linux.ftrace" target_buffer: 0 # 路由到缓冲区 0 ftrace_config { ... } } } data_sources { config { name: "linux.process_stats" target_buffer: 1 # 路由到缓冲区 1 process_stats_config { ... } } }
对于需要长时间追踪的场景,Perfetto 支持 write_into_file 模式:
protobufwrite_into_file: true file_write_period_ms: 5000 # 每 5 秒刷新一次 buffers { size_kb: 16384 # 只需容纳两次刷新间隔的数据 fill_policy: RING_BUFFER }
在这种模式下:
Perfetto SDK 支持两种运行模式:


Perfetto 的 Producer-Consumer 架构是其高性能和灵活性的基石。通过共享内存和 ProtoZero 序列化实现极低开销,通过服务化架构实现组件解耦和可扩展性。理解这套架构,是深入使用和定制 Perfetto 的前提。
在下一篇文章中,我们将实战演示如何在 Android 设备上抓取 Perfetto trace,涵盖命令行、UI 以及编程方式的完整操作流程。