Perfetto学习大全

server/2024/11/24 17:06:25/

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

Perfetto_3">Perfetto的主要作用

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

Perfetto__19">Perfetto 的发展历史

起源
  • PerfettoGoogle 开发,最初作为 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__41">Perfetto 的现状

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

Perfetto__46">如何抓取 Perfetto 数据

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

Perfetto_UI_48">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.Tracefun 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_150">如何使用Perfetto分析数据

Perfetto 数据分析的核心是理解数据的来源、使用工具提取信息,并将结果与性能瓶颈或问题对齐。分析主要分为可视化分析和数据挖掘两个部分。

Perfetto_UI_153">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 使用时间最长的线程:
SELECTthread_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;
  • 主线程分析查找主线程的任务分布:
SELECTname,dur / 1e6 AS duration_ms
FROM slice
WHERE thread_name = 'main'
ORDER BY duration_ms DESC;
  • 内存使用分析内存分配峰值:
SELECTtimestamp / 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性能分析


http://www.ppmy.cn/server/144591.html

相关文章

嵌入式开发人员如何选择合适的开源前端框架进行Web开发

在嵌入式系统的Web开发中,前端框架的选择对于项目的成败有着决定性的影响。一个合适的框架不仅能提高开发效率,还能保证系统的稳定性和可扩展性。本文将介绍几款适用于嵌入式Web开发的开源前端框架,并探讨它们的优缺点。 1. Element Plus V…

【Python入门第八讲】不可变的列表 | 元组

元组 列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。 Python将不能修改的值称为不可变的&…

在win10环境部署opengauss数据库(包含各种可能遇到的问题解决)

适用于windows环境下通过docker desktop实现opengauss部署,请审题。 文章目录 前言一、部署适合deskdocker的环境二、安装opengauss数据库1.配置docker镜像源2.拉取镜像源 总结 前言 注意事项:后面docker拉取镜像源最好电脑有科学上网工具如果没有科学上…

php:nginx如何配置WebSocket代理?

在nginx配置中加入以下配置即可: server {listen 80;server_name test.com;# 配置 WebSocket 代理location /ws {proxy_pass http://127.0.0.1:8083;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade&qu…

软硬件项目运维方案书,系统运维资料,运维实施方案,运维服务方案(Word原件)

1 系统的服务内容 1.1 服务目标 1.2 信息资产统计服务 1.3 网络、安全系统运维服务 1.4 主机、存储系统运维服务 1.5 数据库系统运维服务 1.6 中间件运维服务 2 运维服务流程 3 服务管理制度规范 3.1 服务时间 3.2 行为规范 3.3 现场服务支持规范 3.4 问题记录规范 4 应急服务响…

C++初阶——类和对象(下)

目录 1、再探构造函数——初始化列表 2、类型转换 3、static成员 4、友元 5、内部类 6、匿名对象 7、对象拷贝时编译器的优化(了解) 1、再探构造函数——初始化列表 1. 构造函数初始化除了使用函数体内赋值,还有一种方式——初始化列表, 初始化列…

element-plus教程:Layout 布局

一、基础用法 1. 引入Layout布局组件 首先&#xff0c;确保你已经在项目中安装了Element Plus&#xff0c;并在main.js或main.ts中引入了Element Plus及其样式。 2. 使用<el-row>和<el-col>组件 在Element Plus中&#xff0c;Layout布局主要通过<el-row>…

实验四:构建园区网(OSPF 动态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、在 eNSP 中部署网络 2、设计全网 IP 地址 3、配置二层交换机 4、配置路由交换机并测试通信 5、配置路由接口地址 6、配置 OSPF 动态路由&#xff0c;实现全网互通 一、实验简介 使用路由…