
Perfetto 是什么?
Perfetto 是一套开源的软件开发工具包(SDK)、守护进程(daemon)和工具集合,它通过追踪技术帮助开发者理解复杂系统的行为,并定位客户端/嵌入式系统中的功能问题与性能瓶颈。
它包含以下组件:
- 高性能追踪守护进程:可捕获单台设备上多个进程的追踪信息,整合到一个统一的追踪文件中,用于后续离线分析与可视化。
- 低开销追踪 SDK:适用于 C/C++ 代码的直接用户态到用户态追踪,可记录时序信息与状态变化。
- 丰富的系统级探针(Android 与 Linux):在追踪过程中捕获更广泛的系统级上下文信息,例如调度状态、CPU 频率、内存分析、调用栈采样等。
- 完全本地化的浏览器端 UI:可在时间轴上可视化大量复杂、相互关联的数据。该 UI 支持所有主流浏览器,无需安装,可离线使用,且能打开其他(非 Perfetto)追踪工具录制的追踪文件。
- 功能强大的 SQL 分析库:可通过编程方式在时间轴上分析大量复杂、相互关联的数据,即便这些数据并非通过 Perfetto 录制工具收集。

为什么要使用 Perfetto?
Perfetto 从设计之初就定位为 Android 系统和 Chrome 浏览器的默认追踪系统。因此,Perfetto 官方支持以下场景的追踪数据收集、分析与可视化:
- Android 系统追踪:用于调试和定位 Android 平台及 Android 应用中的功能问题与性能瓶颈。Perfetto 适用于调试多种场景,例如启动缓慢、丢帧(卡顿)、动画异常、内存不足导致的进程被杀、应用无响应(ANR)以及各类常规故障行为。
- Android 上的 Java 堆转储与原生堆分析:分别用于调试和定位 Android 平台及 Android 应用中 Java/Kotlin 代码与 C++ 代码的高内存占用问题。
- Android 上的调用栈采样分析:用于调试和定位 Android 平台及 Android 应用中 C++/Java/Kotlin 代码的高 CPU 占用问题。
- Chrome 浏览器追踪:用于调试和定位浏览器、V8 引擎、Blink 渲染引擎中的问题,在高级场景下还可用于定位网站自身的问题。
除上述"官方"场景外,Perfetto 还包含一套高度灵活的工具集,使其可作为通用追踪系统、性能数据分析工具或时间轴可视化工具使用。
Perfetto 团队会投入部分精力支持这些场景,但其支持优先级低于官方场景。
Perfetto 其他常见的使用场景包括:
- 收集、分析和可视化应用内追踪数据:用于调试 Windows、macOS 及基于 Linux 的嵌入式系统上 C/C++ 应用与库的功能问题和性能瓶颈。
- 收集、分析和可视化 Linux 上的堆分析数据:用于调试 C/C++/Rust 应用与库的高内存占用问题。
- 分析和可视化 Linux 上的 CPU 分析数据(Linux perf 分析结果):用于优化 C/C++/Rust 应用与库的 CPU 占用。
此外,Perfetto 还能分析和可视化多种追踪与分析格式的数据。
它可打开其他各类工具生成的追踪文件和分析结果,让你能在多个数据源上使用 Perfetto UI 及其基于 SQL 的查询引擎,支持的格式包括:
- Chrome JSON 格式
- Firefox Profiler JSON 格式
- Linux perf(二进制与文本格式)
- Linux ftrace 文本格式
- macOS Instruments 格式
- Fuchsia 追踪格式
Perfetto 还可分析和可视化任意"类追踪"数据。
只要数据能转换为 Perfetto 协议缓冲区(protobuf)格式,其分析与可视化工具就能处理所有"类追踪"数据(例如包含时间戳和有效载荷的数据),具体应用场景仅受限于想象力!
为什么不建议使用 Perfetto?
以下几类问题要么并非 Perfetto 的设计目标,要么属于其明确不支持的场景:
1. 为分布式/服务器系统录制追踪数据
Perfetto 并非 OpenTelemetry、Jaeger、Datadog 这类分布式追踪工具。Perfetto 的录制工具仅用于客户端追踪数据的录制,尤其聚焦系统级追踪。我们团队认为,分布式/服务器追踪领域已有上述成熟项目覆盖,这与 Android、Linux/嵌入式系统等客户端系统的情况不同。
不过,若能将分布式追踪数据转换为 Perfetto 支持的格式,仍可使用 Perfetto UI 进行可视化。事实上,Google 内部经常采用这种做法。
2. 在 Windows 或 macOS 上录制系统级追踪数据
Perfetto 的录制工具未与 Windows 或 macOS 上的任何系统级数据源集成。
但 Perfetto 可用于分析和可视化通过 Instruments(macOS 自带工具)收集的 macOS 追踪数据,因为它原生支持 Instruments XML 格式。
3. 在关键路径上消费追踪数据
Perfetto 的生产者(producer)代码已针对低开销追踪写入进行优化,但消费者(consumer)端并未针对低延迟回读优化。
这意味着,不建议在需要端到端低延迟追踪的场景中使用 Perfetto。
4. 以尽可能低的开销录制追踪数据
Perfetto SDK 并未宣称自己是"最快的追踪录制方式":我们清楚,市面上存在能以更低开销捕获追踪数据的库和工具。例如,通过在共享内存(shmem)环形缓冲区中记录固定大小事件并递增原子指针,就能实现比我们的追踪 SDK 更低的开销。
相反,Perfetto 的录制库与守护进程更注重在追踪的性能、灵活性和安全性之间取得良好平衡。
例如,Perfetto 支持任意大小的事件(如高分辨率截图)、多进程追踪协调、不同配置的并发追踪会话、动态缓冲区多路复用、附加到追踪事件的任意嵌套键值参数、动态字符串驻留、用于关联追踪事件的流转(flow)以及动态追踪事件名------这些功能是许多低开销追踪系统所不具备的。
不过,若其他非 Perfetto 工具录制的追踪数据能转换为 Perfetto 协议缓冲区格式,或转换为我们原生支持的其他格式(如 Chrome JSON、Fuchsia 格式等),仍可使用 Perfetto UI 进行可视化。
5. 为游戏录制、分析或可视化 GPU 追踪数据
游戏的追踪与分析与通用软件的追踪存在显著差异,原因包括:整个系统围绕"帧"构建、对 GPU 及其利用率的高度关注、游戏引擎的存在及与之集成的需求等。
由于 Perfetto 并未专门针对游戏开发者关注的核心需求进行优化,我们认为它并不适合这类场景。
虽然我们在 Android 上提供了部分 GPU 渲染阶段和 GPU 计数器录制支持,但这些功能在 Android GPU Inspector(其底层将 Perfetto 作为数据源之一)中得到了更好的支持。
如何开始使用 Perfetto?
我们理解 Perfetto 包含多个组件,新手可能难以判断哪些内容与自己相关。因此,我们专门提供了一个页面解答此问题:《如何开始使用 Perfetto?》(How do I start using Perfetto?)。
目前哪些用户在使用 Perfetto?
Perfetto 是 Android 操作系统和 Chromium 浏览器的默认追踪系统。因此,Google 内部的这些团队会广泛使用 Perfetto,既用于主动发现性能优化点,也用于在本地、实验室甚至生产环境中被动调试/定位问题。
Google 内部还有许多其他团队以各种方式使用 Perfetto,其中包括对追踪系统的"非传统"使用。此外,Perfetto 也已在行业内得到广泛采用,许多其他公司都在使用它。
以下是公开博客文章、文章和视频中提及 Perfetto 的部分案例(非完整列表):
- Google I/O 2023 - 《Dart 与 Flutter 新特性》(What's new in Dart and Flutter)
- Google I/O 2023 - 《Jetpack Compose 调试》(Debugging Jetpack Compose)
- 性能专题:Perfetto Traceviewer - MAD Skills 系列视频("在本期 MAD Skills 性能专题中,Android 性能工程师 Carmen Jackson 将介绍 Perfetto Traceviewer------这是一款可替代 Android Studio 的系统追踪查看工具。")
- Meta Quest 平台上的性能与优化(Performance: Perfetto Traceviewer - MAD Skills)
- 通过比例追踪进行性能测试(Performance testing through proportional traces)
- Twoscomplement 播客某期("我们效率最高的一期播客。Ben 和 Matt 在不到 30 分钟内讨论了性能测试与优化。")
- Collabora:使用 Perfetto 分析虚拟化 GPU 加速(Profiling virtualized GPU acceleration with Perfetto)
- Snap:大规模客户端追踪(Client Tracing at Scale)("由于 Android 设备种类繁多,定位性能问题颇具挑战。通过追踪数据,我们能了解导致糟糕用户体验的具体场景。本文将探讨我们如何为 Snapchat 应用添加埋点,以获取足够的信号来解释问题;此外,还将介绍我们如何将追踪集成到开发流程中------从本地调试、性能测试到最终的生产环境。")
- Microsoft:用于分析 Android、Linux 和 Chromium 浏览器性能的 Perfetto 工具(Perfetto tooling for analyzing Android, Linux, and Chromium browser performance)
- Mesa 3D 图形库:在部分驱动中集成了 Perfetto,用于 GPU 计数器和渲染阶段监控。
- Jane Street 的 MagicTrace:一款基于 Perfetto 的工具,用于录制和可视化 Intel 处理器追踪数据。
在哪里可以获取更多关于 Perfetto 的信息并获得帮助?
- 源代码与项目主页:GitHub(https://github.com/google/perfetto)
- 问答渠道:
- GitHub Discussions(https://github.com/google/perfetto/discussions)或公开邮件列表(perfetto-dev@googlegroups.com)。
- Google 内部员工:使用 YAQS 或内部邮件列表。
- 针对除 Chrome 追踪外 Perfetto 其他所有部分的 Bug 反馈:
- GitHub Issues(https://github.com/google/perfetto/issues)。
- Google 内部员工:使用内部 Bug 追踪系统(go/perfetto-bugs)。
- 针对 Chrome 追踪的 Bug 反馈:
- 访问 http://crbug.com,并添加标签:
Component:Speed>Tracing label:Perfetto。
- 访问 http://crbug.com,并添加标签:
- 与 Perfetto 团队直接沟通:
- 使用 Discord(https://discord.gg/perfetto)。
- Google 内部员工:感谢您的联系。目前所有沟通渠道均处于忙碌状态。您的反馈非常重要,工作人员将尽快回复您。若您的问题确实紧急,请查看此页面(内部链接)。
Perfetto 遵循 Google 开源社区准则(Google's Open Source Community Guidelines)。
要不要我帮你整理一份Perfetto 核心功能与使用场景对照表 ?表格会清晰列出其核心组件、适用场景、不适用场景及对应替代工具,方便你快速查阅和决策。
