perfetto一些重要概念

2,074 阅读6分钟

perfetto 架构:基于服务的模型

  • traced 服务者
  • perfetto 消费者
  • traced_probes 生产者:ftrace交互 和 proc、sys 目录下的接口轮询

架构.png

  • 服务端(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给服务端,并指导其周期性保存到此文件

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可视化
    • perfetto-ui 界面介绍----重要
  • 核心概念-----------很重要
    • trace配置-----------很重要
      • 讲述配置文件的一些概念
      • TraceConfig 和 Buffers 之间的映射关系
      • 传输配置的两种格式
        • PBTX (ProtoBuf TeXtual representation)
        • binary format
    • buffer 和 数据流-----------很重要
      • 从数据上理解perfetto怎么工作的讲述重要
  • 参考--------------------非常重要内容
    • 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 命令使用详解
  • 贡献
    • 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后,整个系统的运行流程---------重要