Perfetto分析进阶

news/2024/10/3 18:00:59

一、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

image

Perfetto UI

image

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.pbtxadb 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会出现内存溢出无法访问。

image

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

// 下载官方trace_processor

curl -LO https://get.perfetto.dev/trace_processorchmod +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文件。

image

3. 常规分析

a. 图例指标

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

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

image

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

image

sched/freq (CPU调度、频率)

image

thread_state (线程状态)

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

image

点击

image

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

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

image

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

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

image

b. 添加标记

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

image

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

c. 锁竞争(lock contention)

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

image

三、SQL查询与展现

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

image

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

image

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

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

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

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

dur:片段持续时长(ns)

track_id属于哪个track(水平timeline)

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

image

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

image

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

image

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

image

sched_slice,线程调度片段

image

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

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/44514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Kali中MSF利用永恒之蓝(复现)

Kali中MSF利用永恒之蓝(复现) 1、进入MSF框架:2、搜索MS17_010漏洞:这里找到了四个模块:0、1、4是漏洞利用模块;2、3是辅助模块,主要探测主机是否存在MS17_010漏洞。 3、利用Auxiliary辅助探测模块对漏洞进行探测(查看下所需要的参数):4、设置要探测的远程目标(两种…

B - Ticket Counter

B - Ticket Counter https://atcoder.jp/contests/abc358/tasks/abc358_b思路 第i个完成的时刻,done[i] 跟第i-1完成时间done[i-1]有关系, 第i个的开始时刻t[i] 大于 done[i-1], done[i] = t[i]+a第i个的开始时刻t[i] 不大于 done[i-1], done[i] = done[i-1]+aCode https…

使用Kimi+Markmap总结文件内容生成思维导图原创

一份文件内容太长,完整阅读下来太费时间,但如果使用AI进行内容提炼,再总结成思维导图,方便快速看到这份文件的核心内容和主题结构,就会极大地节约时间,目前就可以使用Kimi+Markmap这两个工具,帮我们把ppt、word、pdf等文件内容快速总结成思维导图。 一、工具准备 Kimi,…

vue状态共享--VUEX

一,VUEX是什么 Vue中跨组件状态管理模式+库 包含以下几个部分: 状态:State,驱动应用的数据源; 视图:Vue组件,以声明方式将状态映射到视图; 操作:Action,响应在视图上的用户输入导致的状态变化。

2024/4/1

今天完成了结对作业,完成了web端和手机端的主要功能, 其中数据库分为两个表,第一个表简单的记录地铁每条线的id以及地铁线的名字,第二个表是主用表,同时存储许多数据,存储线路上节点的id 上一站点的id以及下一站点的id 还有本站点的名字,以及本站点在本线路的顺序,是否…

Codeforces Round 953 Div.2 F 题解

经典蹭热度连通块计数的一种常见思路是钦定代表元,但发现这题的连边方式并不好指定一个代表元,那么只能尝试优化建图。 我们尝试观察一下连边的情况,通过手玩样例获得一些几何直观的感受: 3 4 5 5 3 4 4 5 3这个样例也许比较小,不过你真的把边画出来就会发现:连边形如 \(…

Docker系列 V1 - 在 Ubuntu 24.04 LTS 上安装 Docker

在 Ubuntu 24.04 LTS 上,虽然可以通过 Ubuntu 的官方仓库直接安装 Docker,但是这种方法通常无法获取到最新的 Docker 版本,而且安全更新也可能延迟。 因此,推荐从 Docker 的官方仓库进行安装,确保可以用上最新版本并和自动更新。 第 1 步:更新软件包并安装必要软件 运行以…