Perfetto学习大全

时间:2024-11-23 21:26:07

Perfetto 是一个功能强大的性能分析和追踪工具,主要用于捕获和分析复杂系统中的事件和性能数据,特别是在 Android 和 Linux 环境下。它的核心目标是帮助开发者深入了解系统和应用程序的运行状态,以便优化性能和诊断问题。

Perfetto的主要作用

  1. 系统性能分析
    • 捕获 CPU、GPU、内存、I/O 等方面的性能数据。
    • 帮助分析瓶颈和资源使用情况。
  2. 应用性能分析
    • 追踪应用中特定任务的执行时间,例如函数调用、帧渲染等。
    • 支持用户自定义事件的插桩。
  3. 多进程和跨设备追踪
    • 可以追踪多个进程之间的交互。
    • 支持 Android 设备和其他 Linux 系统上的追踪。
  4. 多样化数据展示
    • 提供可视化界面(Perfetto UI),展示时间线、任务分布、帧率等。
    • 生成可以在 CI/CD 流程中使用的报告。
  5. 替代 Systrace
    • Perfetto 是 Android 平台中传统 Systrace 工具的继任者,提供更高效、更现代的性能分析能力。

Perfetto 的发展历史

起源
  • Perfetto 由 Google 开发,最初作为 Android 平台的一部分,用来补足 Systrace 和其他工具的不足。
  • 它的名字源于意大利语,意为“完美”。
发展历程
  1. 早期阶段(2017-2018 年)
  • 在 Android 开发者工具中引入,作为内部性能分析工具。
  • 随着 Android P(API 级别 28)的推出,开始逐步集成到 Android 平台。
  • 扩展了 Systrace 的功能,并加入了对更多硬件事件的追踪能力。
  1. 成熟阶段(2019 年)
    • Perfetto 成为 Android 官方性能追踪工具,完全取代 Systrace。
    • 提供开放的 API,使开发者可以轻松插入自定义追踪事件。
    • 引入了强大的追踪文件格式(Proto-based)和本地分析支持。
  2. 跨平台扩展(2020 年及之后)
    • 虽然起源于 Android,Perfetto 逐渐支持其他 Linux 平台。
    • 支持嵌入式设备和桌面环境的性能分析。
    • 被集成到更多的 Google 内部工具中,如 Chrome 的追踪系统。
  3. 现代化(2022 年及之后)
    • 提供了完全开源的解决方案,开发者可访问其源码并自定义功能。
    • Web UI 和命令行工具持续优化,提升了数据展示和分析效率。
    • 在 Perfetto UI 中引入了更多直观的分析视图,如 flame graph(火焰图)、内存转储分析等。

Perfetto 的现状

Perfetto 已成为性能分析领域的一个标杆工具,在 Android 和 Linux 社区中有广泛的应用,并不断扩展到更多平台和场景。它以现代化的设计、强大的功能和灵活的 API 支持,满足了从应用程序开发到系统优化的多样化需求。

如何抓取 Perfetto 数据

使用 Perfetto 捕获性能数据,涉及几个步骤:配置追踪、启动捕获、保存数据,并分析结果。以下是详细步骤和方法:

1. 使用 Perfetto UI

Perfetto 提供了基于浏览器的可视化界面,可以直接进行数据捕获和分析。

步骤
  1. 连接设备将 Android 设备通过 USB 连接到开发电脑,并确保开发者模式和 USB 调试已启用。
  2. 打开 Perfetto UI访问 Perfetto UI。
  3. 配置追踪
    • 点击 Record new trace
    • 选择目标设备(需启用 WebUSB)。
    • 配置追踪设置(如 CPU、内存、帧率、GPU 等)。
  4. 启动追踪点击 Start recording 开始追踪。系统会实时收集数据。
  5. 停止追踪并下载数据追踪结束后,点击 Stop tracing,然后下载生成的 .perfetto-trace 文件。
    在这里插入图片描述

2. 使用命令行工具 (ADB)

步骤
  1. 连接设备确保设备通过 USB 连接,并启用了开发者模式。
  2. 推送 Perfetto 配置文件
    使用 adb 将配置文件推送到设备:
adb push config.pbtxt /data/local/tmp/config.pbtxt

配置文件格式为 proto 或文本格式,定义追踪内容。
3. 启动 Perfetto 守护进程
在设备上启动 Perfetto:

adb shell perfetto --txt -c /data/local/tmp/config.pbtxt -o /data/local/tmp/trace_file
- --txt: 指定配置文件是文本格式。
- -c: 配置文件路径。
- -o: 输出文件路径。
  1. 停止追踪
    根据配置文件的 duration_ms(持续时间)自动停止,或手动终止。
  2. 下载追踪文件
    将追踪文件拉取到本地:
adb pull /data/local/tmp/trace_file ./trace_file

3. 使用 Android Studio Profiler

步骤
  1. 打开 Android Studio连接设备并打开要分析的应用项目。
  2. 启动 Profiler
    在 Android Studio 中选择 View > Tool Windows > Profiler
  3. 选择追踪模式
    在 Profiler 界面中选择要捕获的数据类型,例如 CPU、内存或自定义事件。
  4. 开始和停止追踪
    点击 Record 开始追踪,结束时点击 Stop
  5. 导出追踪文件
    在 Profiler 中导出为 .perfetto-trace 文件。

4. 编写自定义代码插桩

Perfetto 支持通过代码插桩收集自定义事件。

示例代码

在应用代码中引入 Perfetto SDK:

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

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 文件。

步骤
  1. 加载数据打开 Perfetto UI,将 .perfetto-trace 文件拖入页面。
  2. 分析时间线
    • 主线程事件 (Main Thread) 查看主线程的执行情况,包括任务分布、耗时任务、空闲时间等。
    • 渲染帧时间 (Frame Rendering) 检查是否有掉帧或卡顿,分析每一帧的组成部分(如绘制、同步、提交等)。
    • 系统事件 包括 CPU 调度、内存分配、I/O 等系统级别的事件。
    • 自定义事件 如果代码中插入了自定义 Trace,可以在特定区域找到对应事件。
  3. 使用 Perfetto 工具
    Perfetto UI 提供了一些内置工具:
    • Query:使用 SQL 查询数据,提取统计信息。
    • Flame Chart (火焰图):查看函数调用和线程活动。
    • Heap Profiler:分析内存使用和分配热点。
    • Slices:分解任务,显示每个子任务的执行时间。
  4. 标注和导出
    • 可以标记关键点,如性能瓶颈或异常事件。
    • 支持导出分析截图或数据片段供进一步处理。

2. 使用 Trace Processor (命令行工具)

Trace Processor 是 Perfetto 提供的 CLI 工具,用于从 .perfetto-trace 文件中提取和分析数据。

安装 Trace Processor

Perfetto 官方页面 下载并安装。

常用命令
  1. 加载追踪文件
trace_processor_shell trace_file.perfetto-trace
  1. 查看支持的表
.tables

输出所有支持的 SQL 表,例如 sched(调度信息)、slice(任务切片)、cpu(CPU 使用情况)等。
3. 示例 SQL 查询

  • CPU 使用率查询 CPU 使用时间最长的线程:
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;
  • 主线程分析查找主线程的任务分布:
SELECT
  name,
  dur / 1e6 AS duration_ms
FROM slice
WHERE thread_name = 'main'
ORDER BY duration_ms DESC;
  • 内存使用分析内存分配峰值:
SELECT
  timestamp / 1e6 AS time_ms,
  value / 1024 AS memory_kb
FROM counters
WHERE name = 'mem.rss';
  1. 导出分析结果
    查询结果可以通过命令行导出为 CSV 或 JSON 文件:
trace_processor_shell trace_file.perfetto-trace --query=query.sql > output.csv

3. 火焰图 (Flame Graph) 分析

火焰图是 Perfetto 数据分析中的关键工具之一,用于展示函数调用的层级结构和执行时间。

查看火焰图
  1. 在 Perfetto UI 中,找到火焰图选项。
  2. 选择线程或任务,展开火焰图:
    • 每一层表示一个函数调用栈。
    • 宽度表示函数的执行时间。
  3. 寻找宽度异常的大区域,通常是性能瓶颈所在。
    请添加图片描述

4. 常见分析场景

4.1 CPU 密集型问题
  • 在 sched 或 slice 表中,查询线程调度信息。
  • 寻找占用 CPU 时间最长的任务和线程。
4.2 掉帧和渲染卡顿
  • 在 Perfetto UI 的帧时间线上,查找耗时过长的帧。
  • 检查帧中 RenderDrawSubmit 阶段的耗时。
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性能分析