如何开始使用 Perfetto?
TIP: 如果你不熟悉 "Tracing" 这个词,或者刚接触性能领域,我们建议先阅读什么是 Tracing?页面。如果你不太确定 Perfetto 是什么以及为什么它有用,请先查看 Perfetto 主页。
Perfetto 是一个大型项目,对于新手来说,了解文档的哪些部分与他们相关可能会让人感到困难。通过关注你使用的技术和你想要实现的目标,本页面将引导你浏览我们的文档,并帮助你尽快使用 Perfetto 解决问题。
我们的文档使用了术语"Tutorials"、"Cookbooks"和"Case Studies":
- Tutorials(教程)是关于如何开始使用 Perfetto 工具的指南。它们侧重于教你使用工具本身,而不是如何使用工具来解决现实世界的问题。
- Cookbooks(实战指南)是包含小型、简明指南(配方)的页面,可以让你快速了解如何用 Perfetto 解决具体问题。它们会提供可以复制粘贴的代码片段或可以遵循的指令序列。
- Case Studies(案例研究)是详细的、有明确观点的指南,会一步一步教你如何使用 Perfetto 调试和排查一个"垂直"问题的根本原因。它们更多是帮助你解决问题,而不是教你使用 Perfetto 工具。它们还可能大量使用非 Perfetto 工具或命令,只要合适的话。
根据你感兴趣的技术,请选择以下任一章节继续:
Android 应用和平台开发者
Perfetto 是 Android 上的默认 Tracing 系统。它提供了一种强大的方式来理解 Android 操作系统和应用程序的复杂运作,使开发者不仅能够诊断性能瓶颈,还能分析复杂的功能问题和意外行为。通过捕获系统和应用程序活动的详细、按时间顺序的记录,Perfetto 可以帮助你看到不同组件如何随时间交互。
如果你是开发 Android 应用或 Android 平台代码的开发者(即 Android 操作系统本身),Perfetto 可以帮助你回答各种各样的问题:
- 为什么某个操作比预期耗时更长?
- 什么事件序列导致了这个 bug?
- 在特定用例中,不同进程和系统服务如何交互?
- 我的组件在特定系统条件下是否正常工作?
- 为什么我的应用——或整个系统——占用了这么多内存?
- 我如何优化组件的 CPU 或资源使用?
- 在关键时刻,各种系统组件的状态是什么?
作为 Android 应用开发者,你可能已经通过一些应用专注的工具使用 Perfetto,这些工具在底层使用 Perfetto。例如:
- Android Studio Profiler
- Android GPU Inspector
- AndroidX Macrobenchmark Library
- Android SDK 中的 ProfilingManager API
这些项目在底层使用 Perfetto trace 工具,向应用开发者展示更完善和精心策划的体验。另一方面,它们倾向于暴露较少的功能集,以优先考虑易用性和减少认知负担。
如果你刚开始应用 tracing,你应该首先查看上述工具,因为它们提供了更平滑的学习曲线。另一方面,如果你想使用完整的功能集,并接受更大的复杂性和专业性要求的代价,你可以直接使用 Perfetto 并利用其前沿特性。
本指南以及其余文档可以帮助你开始使用 Perfetto,以更深入地了解你的应用行为及其与 Android 系统的交互。
作为 Google 平台开发者,Perfetto 深度集成于 Android 平台变更的整个开发过程中。平台开发者可以(链接仅供 Googler 访问):
- 在开发功能或修复 bug 时本地收集 Perfetto trace
- 在 Android 实验室测试中收集、分析和可视化 Perfetto trace
- 从 Android 现场遥测系统中收集、分析和可视化 Perfetto trace
以下指南可以帮助你了解 Perfetto 提供的用于全面系统分析和调试的低级工具范围。
许多 OEM 和合作伙伴在他们自己的公司内部也有与上述类似的本地/实验室/现场系统:请咨询你公司的内部文档了解详情。
以下指南可以帮助你了解 Perfetto 提供的用于全面系统分析和调试的低级工具范围。
理解系统行为和调试功能问题
不同组件如何交互?导致问题的事件序列是什么? 系统 trace 提供了跨内核、系统服务和应用程序活动的详细、时间相关的视图。这对于理解复杂的交互和调试跨多个组件的问题非常宝贵。Perfetto UI 是可视化这些 trace 的主要工具。
- 教程:采集和分析系统 trace
- 参考:CPU 调度数据源(通常是理解交互和组件状态的关键)
如何在我的代码中看到详细的执行流程和状态? 要了解代码库(应用或平台服务)中特定操作的时序和序列,请通过插桩(
android.os.Trace或 ATrace NDK)添加自定义 trace 点。这些在 trace 中显示为不同的 slice,帮助你调试逻辑流程和测量内部持续时间。如何使用 bugreport 或 logcat 等现有诊断文件? Perfetto 工具通常可以处理常见的 Android 诊断输出,让你利用其可视化和分析功能。
- Android
bugreport.zip文件通常包含 Perfetto trace。Perfetto UI 可以直接打开这些文件,自动提取并加载 trace。 - 你可以可视化
adb logcat输出以及 trace 数据。Perfetto 也可以配置为将 logcat 直接包含到新的 trace 中。
- Android
优化性能和解决延迟问题
当组件变慢、出现卡顿或关键操作耗时过长时,Perfetto 提供了调查问题的工具。这可能涉及直接的 CPU/GPU 工作,但在 Android 上,延迟通常源于进程间通信(IPC),如 Binder、锁争用、I/O 等待或低效调度。主要与内存消耗相关的问题,请参阅下面的"诊断内存问题"部分。
什么导致我的组件或用户交互出现延迟或卡顿? 系统级 trace 对于理解多种类型的延迟至关重要。通过可视化线程状态(运行中、可运行、睡眠、I/O 阻塞或锁阻塞)、调度决策以及用户空间事件(如 ATrace 标记或自定义 SDK 事件)的时序,你可以精确定位时间花在哪里。这对于识别以下问题至关重要:
- Binder/IPC 延迟:查看你的组件等待其他进程响应的时间。
- 锁争用:识别被阻塞等待互斥锁的线程。
- 调度延迟:确定当你的线程变为可运行时是否及时被调度。
- I/O 等待:查看操作是否在磁盘或网络 I/O 上被阻塞。
- UI 卡顿:将系统活动与帧生产和呈现相关联,通常与 FrameTimeline 数据结合使用。
起点包括:
- 教程:采集和分析系统 trace
- 参考:CPU 调度数据源
为什么 UI 特别卡顿或丢帧? 对于 UI 渲染管道的详细分析,Android 的 FrameTimeline 数据源非常有用。它跟踪从应用渲染到合成再到显示的帧,精确定位哪个阶段错过了截止时间。
我的代码的哪些部分消耗最多 CPU 时间(如果 CPU 确实是瓶颈)? 如果系统 trace 表明你的组件确实在 CPU 上花费了大量时间,那么 CPU 分析可以帮助识别具体负责的函数。Perfetto 可以捕获这些 profile 或可视化从
simpleperf收集的 profile。
诊断内存问题
高内存使用会导致性能下降、垃圾回收暂停增加(对于 Java/Kotlin),甚至应用或服务被低内存杀手(LMK)杀死。对于全面解决这些问题,请从我们的详细案例研究开始:
- 案例研究:调试 Android 内存使用
Perfetto 还提供了专门用于调查和归因内存使用的工具:
如何找出哪些 Java/Kotlin 对象使用最多内存或识别潜在泄漏? Java/Kotlin 堆转储提供了特定时间点托管堆上所有对象的快照。你可以分析它来查看对象计数、大小和保留路径(什么使对象保持存活),帮助你找到内存泄漏或意外大的对象。
我的代码中原生(C/C++)内存分配在哪里? 对于原生代码,heap profiling 跟踪
malloc和free调用(或 C++ 中的new/delete),将分配归因于特定的函数调用栈。这有助于识别高原生内存使用或频繁分配和释放的区域。系统整体内存使用情况如何? Perfetto 可以从内核获取系统级内存指标,包括活动内存、可用内存、页面缓存等,帮助你了解系统的整体内存健康状况。
Linux 内核开发者
Perfetto 与 Linux 内核深度集成,为内核开发者提供了强大的工具来理解系统行为、调试问题和优化性能。它与以下组件对接:
- ftrace:用于捕获详细的、高频的内核事件,如调度变化、系统调用、中断和自定义跟踪点。Perfetto 作为 ftrace 的高效用户空间守护进程。Perfetto 还支持通过 ftrace 采集和可视化整个 funcgraph trace,以在 Timeline 上跟踪每个内核函数的进入/退出。
- /proc 和 /sys 接口:用于轮询低频内核统计信息、进程信息(如命令行和父子关系)以及系统级计数器(例如内存使用、CPU 频率)。
- perf events:用于基于硬件或软件计数器采样内核和用户空间调用栈的 CPU 分析。
以下是 Perfetto 如何协助 Linux 内核开发和调试:
如何理解内核级活动,如调度、系统调用或特定驱动程序行为? Perfetto 捕获的系统 trace 提供了内核操作的详细 Timeline。你可以配置 Perfetto 记录广泛的 ftrace 事件,让你深入了解调度器、中断处理程序和系统调用等内核子系统。这对于调试内核错误、理解驱动程序交互或分析系统响应能力非常宝贵。Perfetto UI 是可视化和初步分析这些 trace 的主要工具。
- 教程:在 Linux 上采集系统 trace(重点关注 Linux 特定的 ftrace 配置)
- 参考:CPU 调度数据源
- 参考:系统调用数据源
- 参考:内存计数器和事件(来自 /proc、/sys 和 kmem ftrace)
如何为我的内核代码添加自定义插桩并在 trace 中查看它? 在开发新内核功能或调试特定模块时,你可以在内核代码中定义新的 ftrace 跟踪点。然后可以配置 Perfetto 收集这些自定义事件,允许你在 Timeline 上将你的插桩与标准内核事件一起可视化,进行有针对性的调试。
- 教程:使用 ftrace 对 Linux 内核进行插桩
- 参考:内核跟踪点文档(外部链接到 kernel.org)
内核(或用户空间)的哪些部分消耗最多 CPU 时间? 如果你怀疑内核或与内核频繁交互的用户空间进程存在 CPU 性能瓶颈,Perfetto 可以使用
perf事件捕获 CPU profile。这有助于识别消耗过多 CPU 周期的函数或内核路径。Perfetto 还可以可视化使用独立perf工具捕获的 profile。
C/C++ 开发者(非 Android)
如果你是开发非 Android C/C++ 应用的开发者,Perfetto 提供了强大的工具来理解和优化你的应用:
如何使用 Perfetto 对我的 C/C++ 代码进行插桩? Perfetto 提供了一个低开销的 SDK,用于对用户空间代码进行插桩。这允许你添加自定义事件来理解代码执行流程。
如何优化我的应用的 CPU 使用? 如果你的应用是 CPU 密集型或你想优化其在 Linux 上的 CPU 消耗,Perfetto 可以捕获 CPU profile。这有助于精确定位消耗最多 CPU 周期的具体函数,指导你的优化工作。
(Linux 特有)如何调查我的 C/C++ 应用的原生内存使用? 在 Linux 上,Perfetto 的原生 heap profiler 可以跟踪
malloc/free(或 C++new/delete)调用,将分配归因于特定的函数调用栈。这对于识别内存泄漏、理解内存抖动或找到降低应用内存占用的机会至关重要。
Rust 开发者
如果你正在开发 Rust 应用程序,社区维护的 Perfetto Rust SDK 允许你对代码进行插桩、采集 trace 并与 Perfetto tracing 服务集成。它支持标准的 Rust tracing crate 以及直接的 Perfetto track event 宏。
如何为我的 Rust 应用添加 Perfetto tracing? Rust SDK 提供 track event 宏、
#[tracefn]proc macro 用于自动函数插桩,以及tracing-subscriberLayer 用于将 Rusttracing生态系统桥接到 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 中打开其他工具的 trace 吗(例如 Chrome JSON、Android Systrace、Linux perf、Fuchsia、Firefox Profiler)? 可以,Perfetto UI 和 Trace Processor 开箱即用地支持各种常见 trace 格式。这允许你在可能已有的数据上使用 Perfetto 高级可视化和基于 SQL 的分析功能。
- 指南:使用 Perfetto 可视化外部 trace 格式 (列出支持的格式以及如何打开它们)
我有自己的自定义日志或时间戳数据。如何在 Perfetto 中查看? 如果你的数据不是直接支持的格式,你可以将其转换为 Perfetto 原生的基于 protobuf 的格式。这允许你在 Timeline 上表示几乎任何类型的时间戳活动,并在它们之间创建复杂的链接。转换后,你可以使用 Perfetto UI 和 Trace Processor 的全部功能。
以上未列出的人员
如果你的特定角色或用例不属于上述类别,别担心!Perfetto 是一套多功能的工具,其核心功能可能仍然与你的需求高度相关。归根结底,Perfetto 在以下几个关键领域表现出色:
采集丰富的 Timeline 数据: Perfetto 提供了相当高性能的 Tracing SDK,并与系统级数据源(如 Linux/Android 上的 ftrace)深度集成。这允许你捕获来自你的应用程序和/或其运行系统的详细、时间相关的事件。
- 创造性思考: 你的问题是否可以通过对你的 C/C++ 代码进行插桩并在 Timeline 上记录事件来理解?我们的使用 Perfetto 采集应用内 trace 教程 展示了如何做。
- 你是否正在使用产生时间戳数据的现有系统?它可能可以转换为 Perfetto 理解的格式。请参阅我们的自定义数据转换指南。
强大的 Timeline 可视化(无需编码): Perfetto UI 旨在直观地探索大型复杂 trace。你可以导航 Timeline、放大到纳秒级细节、检查事件属性以及关联不同进程和硬件组件之间的活动,所有这些都通过图形界面完成,无需编写任何代码。轨道过滤、展开/折叠进程线程以及可视化事件流等功能帮助你了解系统正在做什么。
- 探索多样化数据: Perfetto 可以直接在 UI 中打开各种外部 trace 格式。
- 发现 UI 功能: Perfetto UI 还有 Debug Tracks 等功能,允许通过简单的 UI 配置进行复杂的数据聚合和自定义可视化。
深入的程序化 trace 分析: 对于超越视觉检查、自动化分析或提取自定义指标,Perfetto 的 Trace Processor 引擎允许你使用 SQL 查询 trace。这个强大的后端可以通过编程方式访问。
- 自动化你的洞察: 如果你有重复的分析任务或想从任何 trace(Perfetto 原生或转换的)中提取特定指标,Trace Processor 是无价的。
有关 Perfetto 灵活的架构如何适应各种复杂诊断场景的更多灵感,请参阅:
- Snap 关于[大规模客户端 trace](https://www.droidcon.com/2022/06/28/client-tracing-at-scale/)的演示。
- Collabora 如何使用 Perfetto 进行虚拟化 GPU 加速分析。
如果你不确定从哪里开始或 Perfetto 如何适用于你的独特情况:
- 浏览我们的文档: 使用导航侧边栏探索不同的部分,如"概念"、"数据源"或"深入探索"。
- 参与社区: 在 Discord 或我们的[公开邮件列表](https://groups.google.com/forum/#!forum/perfetto-dev)上提问。