一、Perfetto介绍

Perfetto是Android Q中引入的全新下一代平台级跟踪工具,为Android、Linux和Chrome平台提供了一种通用的性能检测和跟踪分析工具集。其核心是引入了一种全新的用户空间到用户空间的跟踪协议,该协议基于protobuf序列化机制将抓取的数据填充到共享内存缓冲区,可用于获取平台内部的内置数据源(例如ftrace、atrace、logcat),也提供了SDK和Library给上层C++应用程序来实现定制。Perfetto允许通过一个可扩展的配置文件来对数据源抓取进行灵活动态配置,且可以将超长trace数据流记录到文件系统中。

在当前Android实现中,perfetto提供了用于记录系统和应用级trace的service和library、低开销的native+java heap分析工具,可供SQL分析trace文件的library,以及一个基于Web的可视化呈现界面 —— Perfetto UI。

传统systrace

Perfetto UI

Perfetto相比systrace的优势:

a. 操作、查询、定位、可视化分析标记方便快捷;

b. 其可持续记录较长的跟踪记录并导出到文件系统中;

c. 更强的拓展能力,支持扩展ftrace数据解析,解析器及呈现容易更新

d. 内建支持SQLite,通过SQL查询可以方便地进行数据后期处理;

二、使用及分析

1. perfetto trace抓取工具

官方命令行操作,config.pbtx为 trace配置,指定了要抓取的category、时长、buffer大小等信息,具体可参考: https://perfetto.dev/docs/quickstart/android-tracing

adb push config.pbtx /data/local/tmp/config.pbtx

adb shell 'cat /data/local/tmp/config.pbtx | perfetto --txt -c - -o /data/misc/perfetto-traces/trace.perfetto-trace'

2. UI展现

官方网址:https://ui.perfetto.dev/#!/

打开上述网址,点击Open trace file,选择本地录制好的perfetto trace或ftrace、systrace等文件,即可以Timeline方式展现各进程、线程的详细跟踪信息。

当trace文件大于1G时,Open trace file会出现内存溢出无法访问。

此时需要使用trace_processor来辅助,该程序建议在Linux环境下运行,Win10系统可安装WSL (Ubuntu20.04),参考附录安装WSL

// 下载官方trace_processor

curl -LO https://get.perfetto.dev/trace_processor

chmod +x ./trace_processor

运行如下命令来加载perfetto trace文件:

./trace_processor --full-sort -D xxx.pftrace

Windows下也可以运行如下命令(不稳定,内存耗用大):

python3 trace_processor --full-sort -D xxx.pftrace

Chrome浏览器打开 https://ui.perfetto.dev/#!/ ,会自动检测本地是否已经有trace_processor生成的HTTP SERVER(9001端口),如下图提示,请选择

“YES, use loaded trace”,将自动解析 trace_processor已经加载的pftrace文件。

3. 常规分析

a. 图例指标

slice (片段,选中片段后会显示黑色边框)

对应代码中 Trace.beginSection/ATRACE_BEGIN 记录的事件

counter (计数器,离散的数值点) 代码中Trace.traceCounter/ATRACE_INT记录的事件

sched/freq (CPU调度、频率)

thread_state (线程状态)

点击片段上方线程调度信息片段(Running),可以看到线程当前运行在哪个CPU上

点击

,可以在CPU调度中看到该运行片段,可以看到调度时延信息。

被P(Process):system_server的 T(Thread):Binder_1754_18线程唤醒,从就绪到运行延迟了363us,再次点击

,可以回到原片段,这个跳转比systrace更加灵活方便。同样

的,Binder调用也可以如此在目标和原调用线程跳转来分析查看。

b. 添加标记

点击最上方的时间轨道即可添加时间点标记;通过按住鼠标左键选中一块区域或者点击某一片段,然后按下“shift+m”即可添加常驻区域标记。选中已经添加的标记,底部出现的Current Selection TAB里可以为其添加标记名,更改其颜色,以及执行移除操作。

按下“m”添加的是临时区域标记,再次选中另外一块区域添加临时区域时,上一个临时区域会自动移除。

c. 锁竞争(lock contention)

看到lock contention 片段,可以点击上边的monitor contention来查看当前对象锁竞争发生的调用栈,如下详情中显示当前对象锁被Owner (Binder:1754_16)持有,其持锁当前运行在serviceDoneExecuting (AMS.java 16426行),且当前等待该对象锁的线程已经有2个了;当前线程执行被阻塞在getUidState方法中(AMS.java 6614行)。

三、SQL查询与展现

在已经加载trace的perfetto UI界面, Search框中输入 : ,即可开启SQL输入,我们就可以使用SQL来查询并定位具体的trace片段(slice)。

输入SQL语句,Enter,得到查询结果,显示在底部表格中,点击表格中的每一行,可以跳转到具体的slice中,根据trace上下文可以进一步分析问题。

如果仅需要执行SQL查询数据,也可以点击UI界面左侧导航栏中的Query (SQL),输入SQL语句,按CTRL + ENTER执行SQL查询。

[ 此处列出几个常用的Table/View的格式及关键字段信息 ]

slice表,横向track上的一条条小片段

ts:片段起始时间戳(单位ns)

dur:片段持续时长(ns)

track_id属于哪个track(水平timeline)

name: 片段标注的名称,对应Trace中打印的方法名、标记等信息

thread_track表,utid标识线程tid,并不是真实的线程tid

thread表,表示各线程信息,其中utid和thread_track表的utid关联

process表,upid和thread表的upid关联,表示线程所属的父进程

sched_slice,线程调度片段

thread_state,各track上边的线程调度片段,标识线程运行状态

Perfetto分析进阶的更多相关文章

  1. shell日志分析进阶篇

    前面我们说了shell分析日志常用指令,现在我们随ytkah一起看看shell日志分析进阶篇,假设日志文件为ytkah.log //统计不重复抓取数量 cat ytkah.log | awk '{pr ...

  2. linux性能指令分析进阶篇

    作为刚刚走入测试领域的我来说,对性能测试了解的也不是很深,只不过自己平常一直在收集资料,性能测试也没有那么神秘,也请广大测试小白不要陷入误区,其实性能测试跟功能测试关系并不大,即使你做10年功能测试, ...

  3. Fiddler对安卓高版本进行抓包解决方案以及分析 进阶二

    今天是2021年的最后一天了,多分享一些干货吧!看过上一章节教程后会有同学疑惑,我也一步一个脚印的,跟着流程走也设置了代理以及安装了证书,有的同学会发现 为什么手机不能够连接网络了呢?细心一点的同学会 ...

  4. fiddler的安装以及使用同时对Android 与IOS 抓包配置进行分析 进阶 一

    由于工作方向的原因,很久没有用过APP抓包工具了,有那么一天遇到了bug需要协助开发工程师进行定位分析,然后又重新梳理了一下之前常用的抓包工具,这里重点介绍一下目前市面上最流行的几款抓包工具,根据自己 ...

  5. shell分析日志常用指令合集

    数据分析对于网站运营人员是个非常重要的技能,日志分析是其中的一个.日志分析可以用专门的工具进行分析,也可以用原生的shell脚本执行,下面就随ytkah看看shell分析日志常用指令有哪些吧.(log ...

  6. Restful API学习Day4 - DRF版本控制和认证

    参考文档: Django REST framework基础:版本控制 Django REST framework基础:认证.权限.限制 为什么要有版本? 某些客户端 使用低版本只维护不开发新功能 v1 ...

  7. Andorid APK反逆向

    Andorid APK反逆向解决方案---梆梆加固原理探寻http://blog.csdn.net/androidsecurity/article/details/8892635 Android AP ...

  8. DOCKER学习心得

    原文:DOCKER学习心得   前言: Docker的主要学习心得来源于<docker技术入门与实战> --2019.1.1->2019.1.5 la 着重从基础部分--实例分析-- ...

  9. zip伪加密文件分析(进阶版)

    作者近日偶然获得一misc题,本来以为手到擒来,毕竟这是个大家都讨论烂了的题,详情访问链接http://blog.csdn.net/ETF6996/article/details/51946250.既 ...

  10. js菜鸟进阶-jQuery源码分析(1)-基本架构

    导读: 本人JS菜鸟一枚,为加强代码美观和编程思想.所以来研究下jQuery,有需要进阶JS的同学很适合阅读此文!我是边看代码(jquery2.2.1),边翻“javascript高级程序设计”写的, ...

随机推荐

  1. electron安装成功记录

    1.登录官网查看当前最新版本对应的node,注意这里不要看php那个汉化的,他那个是老版本的,node对不上 2.nvm安装一个新的node 3.使用cnpm安装(npm安装还是报错了,记得删node ...

  2. 这才是 PHP 高性能框架 Workerman 的立命之本

    大家好,我是码农先森. 在这个大家都崇尚高性能的时代,程序员的谈笑间句句都离不开高性能,仿佛嘴角边不挂着「高性能」三个字都会显得自己很 Low,其中众所皆知的 Nginx 就是高性能的代表.有些朋友可 ...

  3. 【Mybatis-Plus】03 SpringBoot整合

    创建SpringBoot工程: 选择辅助三件套: 再导入MP相关依赖坐标: <!-- jdbc --> <dependency> <groupId>mysql< ...

  4. 使用ChatGPT时的信息安全问题

    ChatGPT由于其在对话方面的AI性能的卓越表现已经远远超越了同类的产品,因此赢得了国际科研领域的极大重视,并且也得到了广大用户的支持,但是在人们尽情使用的时候往往忘记了关于ChatGPT的信息安全 ...

  5. PKUSC2019 D1T1 题解

    前言 五一网课的例题,但是网上没有详细的题解(其实就是都没放代码),所以来写一篇,就当攒 RP 了.题目可以在这里(不强制在线)或这里(强制在线)提交. 题目简述 有 \(n\)(\(n \leq 5 ...

  6. 9组-Beta冲刺-1/5

    一.基本情况(15分) 队名:不行就摆了吧 组长博客:9组-Beta冲刺-1/5 GitHub链接:https://github.com/miaohengming/studynote/tree/mai ...

  7. Unreal使用GooglePAD生成AAB包,并加在fast-follow资源

    1.修改obbfilter,设置需要添加到obb的pak文件 2.修改项目设置,打AAB包 3.cook stage生成所有Paks文件 4.将部分pak文件拷贝到Intermediate/Andro ...

  8. nvic stm32g0

    STM32G0 32个可屏蔽中断通道 4个可编程优先等级(抢占等级:0~3) 低延时异常和中断处理 电源管理控制

  9. 让你的C程序,可以自动更新版本信息

    一.软件管理 稍微上点规模的软件开发往往周期都非常长, 中间会产生很多临时版本, 这些临时版本往往会有各种各样的bug, 由于项目参与的人员众多.水平参差不齐, 软件分支众多.功能复杂, 经常会有各种 ...

  10. C#反射在数据库连接时的应用

    反射的应用 1.查找指定ID的数据 //查找指定id的数据,返回指定的对象 private T FindData<T>(int id) { Type ty = typeof(T); //在 ...