Perfetto 是一个功能强大的性能分析和追踪工具,主要用于捕获和分析复杂系统中的事件和性能数据,特别是在 Android 和 Linux 环境下。它的核心目标是帮助开发者深入了解系统和应用程序的运行状态,以便优化性能和诊断问题。
Perfetto的主要作用
- 系统性能分析
- 捕获 CPU、GPU、内存、I/O 等方面的性能数据。
- 帮助分析瓶颈和资源使用情况。
- 应用性能分析
- 追踪应用中特定任务的执行时间,例如函数调用、帧渲染等。
- 支持用户自定义事件的插桩。
- 多进程和跨设备追踪
- 可以追踪多个进程之间的交互。
- 支持 Android 设备和其他 Linux 系统上的追踪。
- 多样化数据展示
- 提供可视化界面(Perfetto UI),展示时间线、任务分布、帧率等。
- 生成可以在 CI/CD 流程中使用的报告。
- 替代 Systrace
- Perfetto 是 Android 平台中传统 Systrace 工具的继任者,提供更高效、更现代的性能分析能力。
Perfetto 的发展历史
起源
- Perfetto 由 Google 开发,最初作为 Android 平台的一部分,用来补足 Systrace 和其他工具的不足。
- 它的名字源于意大利语,意为"完美"。
发展历程
- 早期阶段(2017-2018 年)
- 在 Android 开发者工具中引入,作为内部性能分析工具。
- 随着 Android P(API 级别 28)的推出,开始逐步集成到 Android 平台。
- 扩展了 Systrace 的功能,并加入了对更多硬件事件的追踪能力。
- 成熟阶段(2019 年)
- Perfetto 成为 Android 官方性能追踪工具,完全取代 Systrace。
- 提供开放的 API,使开发者可以轻松插入自定义追踪事件。
- 引入了强大的追踪文件格式(Proto-based)和本地分析支持。
- 跨平台扩展(2020 年及之后)
- 虽然起源于 Android,Perfetto 逐渐支持其他 Linux 平台。
- 支持嵌入式设备和桌面环境的性能分析。
- 被集成到更多的 Google 内部工具中,如 Chrome 的追踪系统。
- 现代化(2022 年及之后)
- 提供了完全开源的解决方案,开发者可访问其源码并自定义功能。
- Web UI 和命令行工具持续优化,提升了数据展示和分析效率。
- 在 Perfetto UI 中引入了更多直观的分析视图,如 flame graph(火焰图)、内存转储分析等。
Perfetto 的现状
Perfetto 已成为性能分析领域的一个标杆工具,在 Android 和 Linux 社区中有广泛的应用,并不断扩展到更多平台和场景。它以现代化的设计、强大的功能和灵活的 API 支持,满足了从应用程序开发到系统优化的多样化需求。
如何抓取 Perfetto 数据
使用 Perfetto 捕获性能数据,涉及几个步骤:配置追踪、启动捕获、保存数据,并分析结果。以下是详细步骤和方法:
1. 使用 Perfetto UI
Perfetto 提供了基于浏览器的可视化界面,可以直接进行数据捕获和分析。
步骤
- 连接设备将 Android 设备通过 USB 连接到开发电脑,并确保开发者模式和 USB 调试已启用。
- 打开 Perfetto UI访问 Perfetto UI。
- 配置追踪
- 点击 Record new trace。
- 选择目标设备(需启用 WebUSB)。
- 配置追踪设置(如 CPU、内存、帧率、GPU 等)。
- 启动追踪 点击 Start recording 开始追踪。系统会实时收集数据。
- 停止追踪并下载数据 追踪结束后,点击 Stop tracing ,然后下载生成的
.perfetto-trace
文件。
2. 使用命令行工具 (ADB)
步骤
- 连接设备确保设备通过 USB 连接,并启用了开发者模式。
- 推送 Perfetto 配置文件
使用 adb 将配置文件推送到设备:
bash
adb push config.pbtxt /data/local/tmp/config.pbtxt
配置文件格式为 proto
或文本格式,定义追踪内容。
- 启动 Perfetto 守护进程
在设备上启动 Perfetto:
bash
adb shell perfetto --txt -c /data/local/tmp/config.pbtxt -o /data/local/tmp/trace_file
- --txt: 指定配置文件是文本格式。
- -c: 配置文件路径。
- -o: 输出文件路径。
- 停止追踪
根据配置文件的duration_ms
(持续时间)自动停止,或手动终止。 - 下载追踪文件
将追踪文件拉取到本地:
bash
adb pull /data/local/tmp/trace_file ./trace_file
3. 使用 Android Studio Profiler
步骤
- 打开 Android Studio连接设备并打开要分析的应用项目。
- 启动 Profiler
在 Android Studio 中选择 View > Tool Windows > Profiler。 - 选择追踪模式
在 Profiler 界面中选择要捕获的数据类型,例如 CPU、内存或自定义事件。 - 开始和停止追踪
点击 Record 开始追踪,结束时点击 Stop。 - 导出追踪文件
在 Profiler 中导出为.perfetto-trace
文件。
4. 编写自定义代码插桩
Perfetto 支持通过代码插桩收集自定义事件。
示例代码
在应用代码中引入 Perfetto SDK:
kotlin
import androidx.tracing.Trace
fun exampleFunction() {
Trace.beginSection("Custom Event")
// 执行任务
Trace.endSection()
}
通过这种方式,可以记录自定义任务的运行时间,并在 Perfetto 中查看。
5. 分析追踪数据
捕获数据后,可以通过以下方法分析:
-
Perfetto UI :将 .perfetto-trace 文件拖入 Perfetto UI 查看。
-
命令行工具 :使用 trace_processor_shell 提取统计信息。
-
第三方工具:如火焰图分析工具。
配置文件示例
以下是一个简单的文本配置文件 config.pbtxt
:
protobuf
buffers: { size_kb: 10240 }
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "sched/sched_switch"
ftrace_events: "sched/sched_wakeup"
}
}
}
duration_ms: 5000
- 捕获 sched_switch 和 sched_wakeup 事件。
- 持续 5 秒,使用 10 MB 缓冲区。
如何使用Perfetto分析数据
Perfetto 数据分析的核心是理解数据的来源、使用工具提取信息,并将结果与性能瓶颈或问题对齐。分析主要分为可视化分析和数据挖掘两个部分。
1. 可视化分析 (Perfetto UI)
Perfetto 提供了直观的 Web 界面,可以轻松加载和查看 .perfetto-trace
文件。
步骤
- 加载数据 打开 Perfetto UI,将
.perfetto-trace
文件拖入页面。 - 分析时间线
- 主线程事件 (Main Thread) 查看主线程的执行情况,包括任务分布、耗时任务、空闲时间等。
- 渲染帧时间 (Frame Rendering) 检查是否有掉帧或卡顿,分析每一帧的组成部分(如绘制、同步、提交等)。
- 系统事件 包括 CPU 调度、内存分配、I/O 等系统级别的事件。
- 自定义事件 如果代码中插入了自定义 Trace,可以在特定区域找到对应事件。
- 使用 Perfetto 工具
Perfetto UI 提供了一些内置工具:- Query:使用 SQL 查询数据,提取统计信息。
- Flame Chart (火焰图):查看函数调用和线程活动。
- Heap Profiler:分析内存使用和分配热点。
- Slices:分解任务,显示每个子任务的执行时间。
- 标注和导出
- 可以标记关键点,如性能瓶颈或异常事件。
- 支持导出分析截图或数据片段供进一步处理。
2. 使用 Trace Processor (命令行工具)
Trace Processor 是 Perfetto 提供的 CLI 工具,用于从 .perfetto-trace
文件中提取和分析数据。
安装 Trace Processor
从 Perfetto 官方页面 下载并安装。
常用命令
- 加载追踪文件
bash
trace_processor_shell trace_file.perfetto-trace
- 查看支持的表
sql
.tables
输出所有支持的 SQL 表,例如 sched
(调度信息)、slice
(任务切片)、cpu
(CPU 使用情况)等。
- 示例 SQL 查询
- CPU 使用率查询 CPU 使用时间最长的线程:
sql
SELECT
thread_name,
SUM(dur) / 1e6 AS total_time_ms
FROM sched
JOIN thread USING(utid)
GROUP BY thread_name
ORDER BY total_time_ms DESC
LIMIT 10;
- 主线程分析查找主线程的任务分布:
sql
SELECT
name,
dur / 1e6 AS duration_ms
FROM slice
WHERE thread_name = 'main'
ORDER BY duration_ms DESC;
- 内存使用分析内存分配峰值:
sql
SELECT
timestamp / 1e6 AS time_ms,
value / 1024 AS memory_kb
FROM counters
WHERE name = 'mem.rss';
- 导出分析结果
查询结果可以通过命令行导出为 CSV 或 JSON 文件:
bash
trace_processor_shell trace_file.perfetto-trace --query=query.sql > output.csv
3. 火焰图 (Flame Graph) 分析
火焰图是 Perfetto 数据分析中的关键工具之一,用于展示函数调用的层级结构和执行时间。
查看火焰图
- 在 Perfetto UI 中,找到火焰图选项。
- 选择线程或任务,展开火焰图:
- 每一层表示一个函数调用栈。
- 宽度表示函数的执行时间。
- 寻找宽度异常的大区域,通常是性能瓶颈所在。
4. 常见分析场景
4.1 CPU 密集型问题
- 在 sched 或 slice 表中,查询线程调度信息。
- 寻找占用 CPU 时间最长的任务和线程。
4.2 掉帧和渲染卡顿
- 在 Perfetto UI 的帧时间线上,查找耗时过长的帧。
- 检查帧中 Render 、Draw 和 Submit 阶段的耗时。
4.3 内存泄漏
- 使用 Heap Profiler,查找未释放的内存分配。
- 分析 counters 表中的内存使用模式。
4.4 I/O 延迟
- 查看 I/O 相关事件,分析是否存在 I/O 瓶颈或阻塞。
- 在 slice 表中查找 disk 或 file 相关的任务。
工具整合
工具 | 用途 | 优势 |
---|---|---|
Perfetto UI | 数据可视化和交互分析 | 直观,适合初学者和快速分析 |
Trace Processor | 精确数据提取和 SQL 分析 | 灵活,适合复杂场景和自动化流程 |
火焰图工具 | 函数调用分析,定位瓶颈 | 层级清晰,适合查看任务分布 |
通过结合以上工具和方法,可以高效地分析 Perfetto 数据,识别性能问题,并进行优化。
参考
Android Perfetto 系列 2:Perfetto Trace 抓取
Android Perfetto Trace性能分析