perfetto 架构:基于服务的模型
- traced 服务者
- perfetto 消费者
- traced_probes 生产者:ftrace交互 和 proc、sys 目录下的接口轮询
-
服务端(tracing service) 一个守护进程 (Android上是 traced 进程)
- 维护一个数据生产者的注册表,和他们的数据源
- trace buffer 的所有者
- 处理不同的trace 会话
- 把消费者的配置文件转发到相应的数据生产者
- 告诉数据生产和什么时候开始抓数据,抓什么样的数据
- 把 生产者共享内存中的数据转移到数据中心
-
生产者 (traced_probes)
- 生产者是不可信的实体。生产者通常相当于 服务端 的客户端。
- 有一个共享内存,仅和 tracing service 共享内存
- 有一个同 tracing service 交互的IPC通道
- 生产者和消费者完全解耦
- 生产者不知道有多少消费者和 服务端 相连
- 不知道有多少激活的 trace会话
- 不知道有多少其他的生产者
- 不知道其他生产者生产的数据
- 生产者是不可信的实体。生产者通常相当于 服务端 的客户端。
-
消费者 (Android/linux上的命令行客户端:/system/bin/perfetto)
- 消费者是可靠实体。控制 tracing service,运行结束时读取trace数据
- 发送 trace 配置文件到 服务端
- 确定创建多少 trace buffer
- 确定多大的 trace buffer
- 每个 trace buffer 的策略,比如 环形buffer,满时停止
- 使能哪些数据源
- 每个数据源的配置
- 每个数据源应该使用哪个buffer
- 开始和结束trace
- 从 buffer中心 读回buffer
- 流式数据通过IPC通道
- 传递一个fd给服务端,并指导其周期性保存到此文件
- 消费者是可靠实体。控制 tracing service,运行结束时读取trace数据
perfetto 数据源
- Linux's ftrace 记录内核事件
- atrace 记录Android系统层事件
- 对 /proc 和 /sys 等内核接口轮询,获取进程状态,内存状态,硬件状态等(比如CPU\GPU\cdsp频率)
- 其他 heapprofd 收集服务和应用的本地内存使用情况信息
Trace配置各个字段的含义
外部配置决定 tracing 服务端(traced) 自身的行为
duration_ms: 抓trace的时长
data_sources段:
- 读取 data_sources 章节,服务端会把章节内对应的配置信息一字不差的转发给数据生产者
- data_sources--->config--->XXXXX_config
- tracing 服务端(
traced) 会完全忽略掉这些内容,并全部转发给”注册了这些名字的 数据源“ - 比如:ftrace_config、android_power_config、sys_stats_config、process_stats_config
- config 下的各个字段的含义需要查询 perfetto.dev/docs/refere…
buffers 段
- 按照配置文件中的出现的顺序编号,从 0 开始
- 编号 和 data_sources 中的 target_buffer 对应
- 没有target_buffer ,和 buffers 0 对应
- fill_policy
- RING_BUFFER (default): 环形buffer
- DISCARD: 当当缓存区填满时,会停止继续接收。未来如果再尝试写入数据,会先把之前的数据丢掉。
默认情况下,全部trace都在内存中,只有在trace结束时写入到目标文件,对于大trace情况:
- write_into_file (bool) 定期把缓存中的数据全部排出到目标文件
- 生产trace的速率大概为 1-4 MB/s
- file_write_period_ms (uint32) 覆写默认时间,默认时间为5秒。
- 更短的周期会导致更高的性能消耗
- 少于100ms,为100ms
- max_file_size_bytes (uint64)
- 如果总计抓到这么些trace就停下
trigger_config段
触发器:Perfetto 通过触发器 triggers 配置trace的启动以及结束。
使用trigger_perfetto 触发: /system/bin/trigger_perfetto "trigger_name"
trigger_mode: START_TRACING 或者 STOP_TRACING
-
Start 触发器
- 带有 Start触发器 的配置时,接收到对应的 触发器名字才开始记录数据。
- 这期间如果没有接收到触发器事件,则在 trigger_timeout_ms事件后,以不记录任何数据的形式退出
- 不能和 trace_duration_ms 同时存在
- stop_delay_ms:启动记录后,stop_delay_ms事件后再暂停
-
Stop 触发器
- 可以配置 trigger_timeout_ms。在 trigger_timeout_ms时间后停止
- stop_delay_ms:接收到对应的stop触发器, 延迟stop_delay_ms时间后停止
配置文件格式
- 纯文本 (ProtoBuf TeXtual representation) 简称PBTX
- 需要加 --txt
- 二进制
- 不加 --txt
附:文档资料
- 如果仅仅是为了学习使用方法
- 不必到处查资料了,网络上大多人云亦云,说的都不全面
- 看看这篇文章就差不多了 juejin.cn/post/720662…
- 如果为了深入学习
- 也不要去网上查总结性资料了,大多也没啥营养
- 直接去看官网的100多篇英文文档资料,不仅仅是 Quickstart 那些东西。
官网文档 和 源码树 下的文档:
- external/perfetto/docs 和 perfetto.dev/docs/ 文档类似,但是会因为版本差异很多地方差别还是比较大
- perfetto.dev/docs/ 的东西是最新的,自身源码树下的文档是跟随Android系统走的。有些数据源因为版本原因无法使用。
- external/perfetto其他目录下,还会有些零零散散的文档。perfetto.dev/docs/ 的文档并不全面,没有涉及这部分内容。
perfetto.dev/docs 文档中一些比较重要的文档:
- 概览-----概述性的东西,网上大多数文章翻译了下这点内容。
- 快速入门
- 在Android上抓trace--------很重要
- 在Linux上抓trace
- 抓chrome的trace
- trace文件格式转换
- 堆分析---------------很重要
- Android调用采样
- 使用案例介绍
- Android 启动 trace---------------很重要
- 内存使用调式-----------------------很重要
- 数据源-----------介绍了以下内容怎么去抓,trace解析后UI界面怎么显示的,SQL怎么查询--------很重要
- 内存
- cpu
- 电源
- Android系统
- trace分析----大部分是数据库查询分析的内容
- trace-processor(SQL)
- Trace Processor 嵌入到了各个模块中,很重要的东西
- 讲述的一些概念重要内容
- trace-processor(SQL)
- trace可视化
- perfetto-ui 界面介绍----重要
- 核心概念-----------很重要
- trace配置-----------很重要
- 讲述配置文件的一些概念
- TraceConfig 和 Buffers 之间的映射关系
- 传输配置的两种格式
- PBTX (ProtoBuf TeXtual representation)
- binary format
- buffer 和 数据流-----------很重要
- 从数据上理解perfetto怎么工作的讲述重要
- trace配置-----------很重要
- 参考--------------------非常重要内容
- Trace Config proto -----------------很重要
- protos/perfetto/config/trace_config.proto 各种配置属性解释
- 需要抓什么杨的trace,参考这里的内容
- Trace Packet proto
- protos/perfetto/trace/trace_packet.proto 数据包各种数据的解释
- trace文件数据定义
- perfetto cmdline--------------------很重要
- /system/bin/perfetto 命令详解
- 解释了 两种抓取模式:轻量模式 和 通用模式
- heap_profile cmdline------------------tools/heap_profile 命令使用详解
- Trace Config proto -----------------很重要
- 贡献
- getting started---------讲述了怎么给 perfetto 提代码
- Build-Instructions--------讲解 独立编译,源码树下编译,浏览器UI编译-------重要
- Common tasks-------重要
- 怎么添加 ftrace 打点
- 怎么添加 metric
- 怎么添加 trace processor 的数据库表
- 设计文档
- API and ABI surfaces--------重要
- ABI稳定性,以及 各个模块之间怎么通过 socket 传出信息的
- Heapprofd design -----------------对于分析内存重要
- Heapprofd wire protocol--------内存分析相关
- Heapprofd sampling--------------内存分析相关
- Life of a tracing session---------讲解开始抓trace后,整个系统的运行流程---------重要
- API and ABI surfaces--------重要