Perfetto学习大全

embedded/2024/11/24 0:37:41/

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/embedded/139986.html

相关文章

【蓝桥杯备赛】深秋的苹果

# 4.1.1. 题目解析 要求某个区间内的数字两两相乘的总和想到前缀和,但是这题重点在于两两相乘先硬算,找找规律: 比如要算这串数字的两两相乘的积之和: 1, 2, 3 1*2 1*3 2*3 1*(23) 2*3 前缀和数组: 1 3 6 发现…

小说推文封面怎么用AI快速制作?

引言 在数字出版和社交媒体时代,一个吸引人的小说推文封面对于吸引读者至关重要。本文将详细介绍如何使用StartAI的文生图工具来制作小说推文封面,包括选择模型、lora和控制参数的步骤。 制作小说推文封面的步骤 1. 确定封面主题和风格 首先&#xf…

Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容)

Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容) 目录 Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容) 一、简单介绍 二、实现原理 三、注意事项 四、案例简单步…

k8s默认使用的后端网络模式

1. CNI简介 在 Kubernetes (K8s) 中,网络后端(CNI 插件)负责为集群中的容器提供网络连接。Kubernetes 默认并没有选择特定的 CNI 插件,而是允许用户根据需求选择使用不同的网络插件。 不过,Kubernetes 通过 kubeadm 或其他工具来初始化集群时,会使用某个默认的网络后端,…

5G轻量级核心网解决方案

随着5G技术的快速发展,各行业对网络能力的需求不断增加,传统的5G核心网(5GC)解决方案由于其高昂的部署和运营成本,常常成为企业面临的一个重大挑战。为了解决这一问题,5G轻量级核心网解决方案应运而生&…

ftdi_sio应用学习笔记 4 - I2C

目录 1. 查找设备 2. 打开设备 3. 写数据 4. 读数据 5. 设置频率 6 验证 6.1 遍历设备 6.2 开关设备 6.3 读写测试 I2C设备最多有6个(FT232H),其他为2个。和之前的设备一样,定义个I2C结构体记录找到的设备。 #define FT…

构建nginx1.26.1轻量级Docker镜像添加第三方模块nginx_upstream_check_module

文章目录 1.构建自定义nginx镜像原因2.准备构建文件3.构建镜像4.验证第三方模块是否加载成功 1.构建自定义nginx镜像原因 docker hub仓库里的nginx官方镜像太大了,足足188MB不能重新引入nginx内部模块 并且也 不能静态方式 添加nginx的第三方模块。因为此过程需要涉…

el-table表头前几列固定,后面几列根据接口返回的值不同展示不同

在使用 Element UI 的 el-table 组件时,如果想要实现表头的前几列固定,而后面的列根据接口返回的数据动态展示,可以通过以下步骤来实现: 1. 固定表头前几列 在 el-table-column 中使用 fixed 属性来固定表头的前几列。例如&…