本篇是 Perfetto 系列文章的第一篇,主要是简单介绍 Perfetto 工具,包括 Perfetto 的历史、发展,以及 Perfetto 能做什么。
随着 Google 宣布 Systrace 工具停更,推出 Perfetto 工具,Perfetto 在我的日常工作中已经基本能取代 Systrace 工具。同时 Oppo、Vivo 等大厂也已经把 Systrace 切换成了 Perfetto,许多新接触 Android 性能优化的小伙伴对于 Perfetto 那眼花缭乱的界面和复杂的功能感觉头疼,希望我能把之前的那些 Systrace 文章使用 Perfetto 来呈现。
Paul Graham 说:要么给大部分人提供有点想要的东西,要么给小部分人提供非常想要的东西。Perfetto 其实就是小部分人非常想要的东西,那就开始写吧,欢迎大家多多交流和沟通,发现错误和描述不准确的地方请及时告知我,我会及时修改,以免误人子弟。
本系列旨在通过 Perfetto 这个工具,从一个新的视角审视 Android 系统的整体运作方式。此外,它还旨在提供一个不同的角度来学习 App 、 Framework、Linux 等关键模块。尽管你可能已经阅读过许多关于 Android Framework、App 、性能优化的文章,但或许因为难以记住代码或不明白其运行流程,你仍感到困惑。通过 Perfetto 这个图形化工具,你可能会获得更深入的理解。
Perfetto 系列目录
- Android Perfetto 系列目录
- Android Perfetto 系列 1:Perfetto 工具简介
- Android Perfetto 系列 2:Perfetto Trace 抓取
- Android Perfetto 系列 3:熟悉 Perfetto View
- 视频(B站) - Android Perfetto 基础和案例分享
如果大家还没看过 Systrace 系列,下面是传送门:
- Systrace 系列目录 : 系统介绍了 Perfetto 的前身 Systrace 的使用,并通过 Systrace 来学习和了解 Android 性能优化和 Android 系统运行的基本规则。
- 个人博客 :个人博客,主要是 Android 相关的内容,也放了一些生活和工作相关的内容。
欢迎大家在 关于我 页面加入微信群或者星球,讨论你的问题、你最想看到的关于 Perfetto 的部分,以及跟各位群友讨论所有 Android 开发相关的内容
正文
2019 年开始写 Systrace 系列,陆陆续续写了 20 多篇,从基本使用到各个模块在 Systrace 上的呈现,再到启动速度、流畅性等实战,基本上可以满足初级系统开发者和 App 开发者对于 Systrace 工具的需求。通过博客也加了不少志同道合的小伙伴,光交流群就建了有 6 个。这里非常感谢大家的支持。
随着 Google 宣布 Systrace 工具停更,推出 Perfetto 工具,Perfetto 在我的日常工作中已经基本能取代 Systrace 工具。同时 Oppo、Vivo 等大厂也已经把 Systrace 切换成了 Perfetto,许多新接触 Android 性能优化的小伙伴对于 Perfetto 那眼花缭乱的界面和复杂的功能感觉头疼,希望我能把之前的那些 Systrace 文章使用 Perfetto 来呈现。
所以就有了这个系列,我也有在星球里面写了几条为什么要更新 Perfetto 系列的原因(之前一直觉得 Systrace 系列就够了):
- 目前 Oppo、Vivo 这些手机厂商内部,都已经切换成 Perfetto 了,不管是抓 Trace 还是看 Trace,都在使用 Perfetto ,很多新人接触的都是 Perfetto 而不是 Systrace ,守着之前的老 Systrace 系列会流失这部分读者
- 之前的 Systrace 系列,对应的 Code 已经比较老了,全新的 Perfetto 系列可以使用 Android 14 的 Code 来进行更新
- 个人对 Perfetto 的使用也没有很深入,有些高阶功能目前还只是浅尝辄止。可以通过重写 Perfetto 系列来进行这部分内容的强化
- Perfetto 是个很强大的工具,他的背后是整个 Android + Linux 系统,所以在写这个系列的时候,应该是以他背后的这个 Android + Linux 为主,而不是仅仅局限于 Perfetto 这个工具。工具只是我们观测 Android + Linux 的方式,理解整个 Android 系统运行的规律,思考其运行的原理,通过工具挖掘问题,通过问题思考本质,这才是对开发者来说有意义的
- 很多 Android 系统运行相关的内容,Perfetto 的官方文档还是没有讲,这部分我这边可以作为补足;另外官方文档是英文版本的,中文博客可以补充这方面。
- Perfetto 可以拿到 Google Dev Fest 上作为演讲内容~。
Paul Graham 说:要么给大部分人提供有点想要的东西,要么给小部分人提供非常想要的东西。Perfetto 其实就是小部分人非常想要的东西,那就开始写吧,欢迎大家多多交流和沟通,发现错误和描述不准确的地方请及时告知我,我会及时修改,以免误人子弟。
性能分析为什么需要上帝视角
在介绍 Perfetto 之前,我们需要了解为什么性能分析需要 Systrace 和 Perfetto 这样的工具:以 Android 系统为例,影响性能的因素是非常多的:App 自身质量、系统各个模块的性能、Linux 的性能、硬件性能,再加上各个厂商的策略、厂商定制的功能、系统自身的负载、低内存、发热、Android 各个版本的差异、用户的使用习惯等。这都不是通过分析某一个 App 或者某一个模块就能知道原因的,我们需要一个上帝视角,从更高的纬度来看 Android 系统的运行情况。
而 Perfetto 工具就提供了这样的一个上帝视角,通过上帝视角我们可以看到 Android 系统在运行时的各个细节,比如
- Input 事件是怎么流转的
- 你正在使用的 App 的每一帧是怎么从 App 产生到上屏的
- CPU 的实时频率、负载、摆核、唤醒等
- 系统中的各个 App 是怎么运行的
- ….
App 开发者和 Android 系统开发者也都会在重要的代码逻辑处加上 Trace 点,打开部分 Debug 选项之后,更是可以得到非常详细的信息,甚至一个 Task 为什么摆在某个 cpu 上,都会有详细的记载。通过这些在 Perfetto 上所展示的信息,我们能初步分析到性能问题的原因,接下来继续分析就会有针对性。
同样为了说明性能优化的复杂性,可以看看 <性能之巅**> 这本书中对于性能的描述,具体来说就是方法论,非常贴合本文的主题,也强烈推荐各位搞性能优化的同学,把这本书作为手头常读的方法论书籍:系统性能工程是一个充满挑战的领域,具体原因有很多,其中包括以下事实,系统性能是主观的、复杂的,而且常常是多问题并存的**
性能是主观的
- 技术学科往往是客观的,太多的业界人士审视问题非黑即白。在进行软件故障查找的时候,判断 bug 是否存在或 bug 是否修复就是这样。bug 的出现总是伴随着错误信息,错误信息通常容易解读,进而你就明白错误为什么会出现了
- 与此不同,性能常常是主观性的。开始着手性能问题的时候,对问题是否存在的判断都有可能是模糊的,在问题被修复的时候也同样,被一个用户认为是“不好”的性能,另一个用户可能认为是“好”的
系统是复杂的
- 除了主观性之外,性能工程作为一门充满了挑战的学科,除了因为系统的复杂性,还因为对于性能,我们常常缺少一个明确的分析起点。有时我们只是从猜测开始,比如,责怪网络,而性能分析必须对这是不是一个正确的方向做出判断
- 性能问题可能出在子系统之间复杂的互联上,即便这些子系统隔离时表现得都很好。也可能由于连锁故障(cascading failure)出现性能问题,这指的是一个出现故障的组件会导致其他组件产生性能问题。要理解这些产生的问题,你必须理清组件之间的关系,还要了解它们是怎样协作的
- 瓶颈往往是复杂的,还会以意想不到的方式互相联系。修复了一个问题可能只是把瓶颈推向了系统里的其他地方,导致系统的整体性能并没有得到期望的提升。
- 除了系统的复杂性之外,生产环境负载的复杂特性也可能会导致性能问题。在实验室环境很难重现这类情况,或者只能间歇式地重现
- 解决复杂的性能问题常常需要全局性的方法。整个系统——包括自身内部和外部的交互——都可能需要被调查研究。这项工作要求有非常广泛的技能,一般不太可能集中在一人身上,这促使性能工程成为一门多变的并且充满智力挑战的工作
可能有多个问题并存
- 找到一个性能问题点往往并不是问题本身,在复杂的软件中通常会有多个问题
- 性能分析的又一个难点:真正的任务不是寻找问题,而是辨别问题或者说是辨别哪些问题是最重要的
- 要做到这一点,性能分析必须量化(quantify)问题的重要程度。某些性能问题可能并不适用于你的工作负载或者只在非常小的程度上适用。理想情况下,你不仅要量化问题,还要估计每个问题修复后能带来的增速。当管理层审查工程或运维资源的开销缘由时,这类信息尤其有用。
- 有一个指标非常适合用来量化性能,那就是 延时(latency)
Perfetto 介绍
Perfetto 是一个高级的开源工具,专为性能监测和分析而设计。它配备了一整套服务和库,能够捕获和记录系统层面以及应用程序层面的活动数据。此外,Perfetto 还提供了内存分析工具,既适用于本地应用也适用于 Java 环境。它的一个强大功能是,可以通过 SQL 查询库来分析跟踪数据,让你能够深入理解性能数据背后的细节。为了更好地处理和理解大规模数据集,Perfetto 还提供了一个基于 Web 的用户界面,使你能够直观地可视化和探索多 GB 大小的跟踪文件。简而言之,Perfetto 是一个全面的解决方案,旨在帮助开发者和性能工程师以前所未有的深度和清晰度来分析和优化软件性能。
谷歌在 2017 年开始了第一笔提交,随后的 6 年(截止到 2024)内总共有 100 多位开发者提交了近 3.7W 笔提交,几乎每天都有 PR 与 Merge 操作,是一个相当活跃的项目。 除了功能强大之外其野心也非常大,官网上号称它是下一代面向可跨平台的 Trace/Metric 数据抓取与分析工具。应用也比较广泛,除了 Perfetto 网站,Windows Performance Tool 与 Android Studio,以及华为的 GraphicProfiler 也支持 Perfetto 数据的可视化与分析。 我们相信谷歌还会持续投入资源到 Perfetto 项目,可以说它应该就是下一代性能分析工具了,会完全取代 Systrace。
如果你已经习惯使用 Systrace,那么切换到 Perfetto 会非常顺滑,因为 Perfetto 是完全兼容 Systrace 的。你之前抓的 Systrace 文件,可以直接扔到 Perfetto Viewer 网站里面直接打开。如果你还没有适应 Perfetto ,你也可以从 Perfetto Viewer 一键打开 Systrace。
下图是 Perfetto 的架构图,可以看到 Perfetto 包含了三大块:
- Record traces :即数据抓取模块,可以看到抓取的内容和来源非常丰富,Java、 Native 、Linux 都有涉及到,相比 Systrace 要丰富很多。
- Analyze traces :主要是 trace 分析模块,包括 Trace 解析、SQL 查询、Metrics 分析等,这部分有专门的命令行工具提供,方便大家直接调用或者在工具链里面去调用。
- Visualize Traces:Trace 的呈现、抓取等
这几个模块在后续的系列文章中都会详细介绍
Perfetto 的核心优势和功能亮点:
通过长时间的使用和对比,以及看各种分享,总结了一下 Perfetto 的核心优势和功能两点
支持长时间数据抓取:
- Perfetto 通过后台服务支持长时间数据抓取,利用 Protobuf 编码存储数据。
数据来源与兼容性:
- 基于 Linux 内核的 Ftrace 机制,记录用户空间与内核空间的关键事件。
- 兼容 Systrace 的功能,并有望最终取代它。
全面的数据支持:
- 支持 Trace、Metric 和 Log 类型的数据。
- 提供多种数据抓取方式,包括网页、命令行工具、开发者选项以及 Perfetto Trigger API。
高效的数据分析:
- 提供数据可视化网页,支持大文件渲染,优于 Systrace。
- Trace 文件可转换为 SQLite 数据库文件,支持 SQL 查询和脚本执行。
- 提供 Python API,允许将数据导出为 DataFrame 格式,为深入分析提供便利。
- 支持函数调用堆栈展示。
- 支持内存堆栈展示。
- 支持 pin 住你感兴趣的行到最上面,不用一直上下翻(通过脚本可以一打开就自动 pin)
- 支持可视化 Binder 调用和跳转
- 支持很方便的查询唤醒源
- 支持 Critical Task 的可视化查询
Google 的持续更新:
- Google 的工具团队在持续更新 Perfetto,版本 Release 和 Bugfix 都非常及时,可以在 Github 上观察。
这里专门提一下 SQL,Perfetto 可以使用 SQL 这是一个巨大的改进,他在解析 Trace 文件的时候,会内建许多 SQL 表和图,方便使用 SQL 语句进行查询,比如下面这几个查询,就是非常实用的(图来自内核工匠)。
另外他的官方文档里面,介绍到对应的部分,也会把对应的 SQL 以及查询结果示例贴出来。
有了这个,就再也不怕老板说你没有数据了,分分钟 SQL 查出来,表格转图标,一份高质量的 Report 就出来了:优化前后,xxx 指标下降了 xx%,属实是非常方便的。
相比 Systrace 没那么好用的地方
Vsync-App 没那么直观
Vsync-App 在 Perfetto 相对来说没那么直观,比如你看习惯了 Systrace 中 Vsync-App 那条贯穿整个 Trace 的竖线,你再看 Perfetto 就没有这个,就会觉得怪怪的:
Perfetto 中,你可以把 Vsync-App Pin 到最上面来看 Vsync 信息
Systrace 中,Vsync 以竖线的方式贯穿整个 Trace,很容易辨别:
当然 Perfetto 取消这个也是有理由的:Vsync-App 其实并不能说明 App 有性能问题,Perfetto 使用了另外一个方式来展示,如果你用 Perfetto 命令抓的 Trace,就会有下面这个信息,记录了 App 一帧的 Expected Timeli 和 Actual Timeline 。相比 Vsync-App,这两指标更能说明问题:原文档
- 预期时间线每个切片代表应用程序用于渲染帧的时间。为了避免系统出现卡顿,应用程序需要在这个时间范围内完成。开始时间是调度 Choreographer 回调的时间。
- 实际时间线这些切片代表了应用程序完成帧的实际时间(包括 GPU 工作)并将其发送到 SurfaceFlinger 进行合成的时间。开始时间是应用程序开始运行的时间。这里的切片的结束时间代表的是。后处理时间是应用程序的帧被发布到 SurfaceFlinger 的时间。
通过看 Expected Timeli 和 Actual Timeline 的差异,我们可以很快速定位到卡顿的点(红色标识的 Actual Timeline 那一帧就是卡顿)
其计算方式如下,看了图你就知道为什么这两个是更准确的(包含了 GPU 执行时间)
相对应的,SurfaceFlinger 也有这两个指标
折叠功能比较烂,比较废屏幕
如果你是普通的宽屏,打开 Perfetto 随便 Pin 几个关键线程到最上面,你下面的可操作空间就很小了,如果碰到某个关键线程堆栈比较长,那就更是顶级折磨了,而且他这个堆栈还不能折叠(Systrace 可以)
解决办法:
- 少 Pin 几个关键线程 (那还有啥乐趣)
- 把显示器竖起来(宽度就打折了)
最终我们找到了完美的方案:换成 LG 那个魔方屏幕,16:18 ,看 Perfetto 简直是绝配(办公室已经被我安利有三台了)
- 不差钱:LG 28MQ780 - 3599
- 平替:[联合创新 28C1Q - 2999](https://item.jd.com/100058985199.html)
参考文档
关于我 && 博客
下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!
- 博主个人介绍 :里面有个人的微信和微信群链接。
- 本博客内容导航 :个人博客内容的一个导航。
- 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
- Android性能优化知识星球 : 欢迎加入,多谢支持~
一个人可以走的更快 , 一群人可以走的更远