如何开始使用 Perfetto?

TIP: 如果你不熟悉 "Tracing" 这个词,或者刚接触性能领域,我们建议先阅读什么是 Tracing?页面。如果你不太确定 Perfetto 是什么以及为什么它有用,请先查看 Perfetto 主页

Perfetto 是一个大型项目,对于新手来说,了解文档的哪些部分与他们相关可能会让人感到困难。通过关注你使用的技术和你想要实现的目标,本页面将引导你浏览我们的文档,并帮助你尽快使用 Perfetto 解决问题。

我们的文档使用了术语"Tutorials"、"Cookbooks"和"Case Studies":

根据你感兴趣的技术,请选择以下任一章节继续:

graph TD A[从这里开始] --> B{你的角色是什么?}; B --> C["Android 应用/平台开发者"]; B --> D["Linux 内核开发者"]; B --> E["C/C++ 开发者(非 Android)"]; B --> F["Chromium 开发者"]; B --> G["我有 trace 类数据"]; B --> H["以上都不是"];

Android 应用和平台开发者

graph TD A[Android 应用和平台开发者] --> B{你的目标是什么?}; B --> C["理解系统行为 / 调试功能问题"]; B --> D["优化性能 / 解决延迟问题"]; B --> E["诊断内存问题"];

Perfetto 是 Android 上的默认 Tracing 系统。它提供了一种强大的方式来理解 Android 操作系统和应用程序的复杂运作,使开发者不仅能够诊断性能瓶颈,还能分析复杂的功能问题和意外行为。通过捕获系统和应用程序活动的详细、按时间顺序的记录,Perfetto 可以帮助你看到不同组件如何随时间交互。

如果你是开发 Android 应用或 Android 平台代码的开发者(即 Android 操作系统本身),Perfetto 可以帮助你回答各种各样的问题:

  1. 为什么某个操作比预期耗时更长?
  2. 什么事件序列导致了这个 bug?
  3. 在特定用例中,不同进程和系统服务如何交互?
  4. 我的组件在特定系统条件下是否正常工作?
  5. 为什么我的应用——或整个系统——占用了这么多内存?
  6. 我如何优化组件的 CPU 或资源使用?
  7. 在关键时刻,各种系统组件的状态是什么?

作为 Android 应用开发者,你可能已经通过一些应用专注的工具使用 Perfetto,这些工具在底层使用 Perfetto。例如:

这些项目在底层使用 Perfetto trace 工具,向应用开发者展示更完善和精心策划的体验。另一方面,它们倾向于暴露较少的功能集,以优先考虑易用性和减少认知负担。

如果你刚开始应用 tracing,你应该首先查看上述工具,因为它们提供了更平滑的学习曲线。另一方面,如果你想使用完整的功能集,并接受更大的复杂性和专业性要求的代价,你可以直接使用 Perfetto 并利用其前沿特性。

本指南以及其余文档可以帮助你开始使用 Perfetto,以更深入地了解你的应用行为及其与 Android 系统的交互。

作为 Google 平台开发者,Perfetto 深度集成于 Android 平台变更的整个开发过程中。平台开发者可以(链接仅供 Googler 访问):

  • 在开发功能或修复 bug 时本地收集 Perfetto trace
  • 在 Android 实验室测试中收集、分析和可视化 Perfetto trace
  • 从 Android 现场遥测系统中收集、分析和可视化 Perfetto trace

以下指南可以帮助你了解 Perfetto 提供的用于全面系统分析和调试的低级工具范围。

许多 OEM 和合作伙伴在他们自己的公司内部也有与上述类似的本地/实验室/现场系统:请咨询你公司的内部文档了解详情。

以下指南可以帮助你了解 Perfetto 提供的用于全面系统分析和调试的低级工具范围。

理解系统行为和调试功能问题

优化性能和解决延迟问题

当组件变慢、出现卡顿或关键操作耗时过长时,Perfetto 提供了调查问题的工具。这可能涉及直接的 CPU/GPU 工作,但在 Android 上,延迟通常源于进程间通信(IPC),如 Binder、锁争用、I/O 等待或低效调度。主要与内存消耗相关的问题,请参阅下面的"诊断内存问题"部分。

诊断内存问题

高内存使用会导致性能下降、垃圾回收暂停增加(对于 Java/Kotlin),甚至应用或服务被低内存杀手(LMK)杀死。对于全面解决这些问题,请从我们的详细案例研究开始:

Perfetto 还提供了专门用于调查和归因内存使用的工具:

Linux 内核开发者

Perfetto 与 Linux 内核深度集成,为内核开发者提供了强大的工具来理解系统行为、调试问题和优化性能。它与以下组件对接:

以下是 Perfetto 如何协助 Linux 内核开发和调试:

C/C++ 开发者(非 Android)

如果你是开发非 Android C/C++ 应用的开发者,Perfetto 提供了强大的工具来理解和优化你的应用:

Chromium 开发者

Perfetto 是 Chromium 浏览器及其相关项目(Angle、Skia、V8)的 chrome://tracing 系统的基础。虽然 Chromium 项目有自己广泛的内部文档和采集分析 trace 的最佳实践,但 Perfetto 为此提供了基础工具。

如果你想从 Chrome 捕获 trace,我们的教程提供了一个直接的方法来开始使用 Perfetto UI:

有关 Chrome 中实际 trace 分析的一般介绍,[这篇 Perf-Planet 博客文章](https://calendar.perfplanet.com/2023/digging-chrome-traces-introduction-example/)也是一个有用的资源。

任何有"trace 类数据"需要分析或可视化的人

Perfetto 强大的 UI 和 Trace Processor 不仅限于 Perfetto 自己采集的 trace。如果你有来自其他系统的现有 trace 或自定义时间戳数据,你通常可以利用 Perfetto 进行可视化和 profile。

以上未列出的人员

如果你的特定角色或用例不属于上述类别,别担心!Perfetto 是一套多功能的工具,其核心功能可能仍然与你的需求高度相关。归根结底,Perfetto 在以下几个关键领域表现出色:

  1. 采集丰富的 Timeline 数据: Perfetto 提供了相当高性能的 Tracing SDK,并与系统级数据源(如 Linux/Android 上的 ftrace)深度集成。这允许你捕获来自你的应用程序和/或其运行系统的详细、时间相关的事件。

    • 创造性思考: 你的问题是否可以通过对你的 C/C++ 代码进行插桩并在 Timeline 上记录事件来理解?我们的使用 Perfetto 采集应用内 trace 教程 展示了如何做。
    • 你是否正在使用产生时间戳数据的现有系统?它可能可以转换为 Perfetto 理解的格式。请参阅我们的自定义数据转换指南
  2. 强大的 Timeline 可视化(无需编码): Perfetto UI 旨在直观地探索大型复杂 trace。你可以导航 Timeline、放大到纳秒级细节、检查事件属性以及关联不同进程和硬件组件之间的活动,所有这些都通过图形界面完成,无需编写任何代码。轨道过滤、展开/折叠进程线程以及可视化事件流等功能帮助你了解系统正在做什么。

    • 探索多样化数据: Perfetto 可以直接在 UI 中打开各种外部 trace 格式
    • 发现 UI 功能: Perfetto UI 还有 Debug Tracks 等功能,允许通过简单的 UI 配置进行复杂的数据聚合和自定义可视化。
  3. 深入的程序化 trace 分析: 对于超越视觉检查、自动化分析或提取自定义指标,Perfetto 的 Trace Processor 引擎允许你使用 SQL 查询 trace。这个强大的后端可以通过编程方式访问。

    • 自动化你的洞察: 如果你有重复的分析任务或想从任何 trace(Perfetto 原生或转换的)中提取特定指标,Trace Processor 是无价的。

有关 Perfetto 灵活的架构如何适应各种复杂诊断场景的更多灵感,请参阅:

如果你不确定从哪里开始或 Perfetto 如何适用于你的独特情况: