返回顶部
首页 > 资讯 > 后端开发 > Python >Perfetto分析进阶
  • 194
分享到

Perfetto分析进阶

可视化javapythonlinux大数据 2023-09-12 21:09:30 194人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

一、Perfetto介绍 Perfetto是Android Q中引入的全新下一代平台级跟踪工具,为Android、linux和Chrome平台提供了一种通用的性能检测和跟踪分析工具集。其核心是引入了一种全新的用户空间到用户空间的跟


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

685eb346af8e5d2b204c53bf20dc49ed.png

Perfetto UI

78c537a0cc693d50bb255f0366a2b5a2.png

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

ae259bdbb1a578bdc7a5f64430cf7892.png

此时需要使用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文件。

9ed6f3197829a9d84cb79e738d0152a4.png

3. 常规分析

a. 图例指标

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

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

4381b3086a47b151cea4237f46e6917a.png

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

199c576b3476f6ca09665f8d0ac80826.png

sched/freq (CPU调度、频率)

db940cb147071578f4fe8a47741517ad.png

thread_state (线程状态)

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

834cf79035b1fd29234cd5ab7f56ad40.png

点击

539eb43ae302d04d2d2e9a76e2cb5925.png

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

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

63a83ca0cb99d9d3eb626fc557659312.png

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

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

53cdd63116d88e27ecef84909efe6d01.png

b. 添加标记

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

21688c0ddc8b2eee9638f0f8b4a30cd8.png

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

c. 竞争(lock contention)

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

836535b339eb5762806f10b08dc3a0f8.png

三、SQL查询与展现

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

b4acb012bd6f4c3a4ad7d95c83ff59be.png

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

f5b04013b291e2085b0307d37656ebbe.png

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

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

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

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

dur:片段持续时长(ns)

track_id属于哪个track(水平timeline)

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

94ce472c535ade2f73f59a3dd589f677.png

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

2afcba99de04a0553df6a828fd3ce82e.png

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

011ede250c51c29d5c92e01fdbdea8c6.png

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

3f6e58ddb9161562203acabaa31f6224.png

sched_slice,线程调度片段

df48e7267882789ac33bb7e01da3e793.png

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

4b0206c2d187e0aec1ff53b2810a4296.png

列举几个常用的SQL查询:

1

列出所有doFrame片段,按耗时倒序排列,取前100条

select slice_id,track_id,ts,dur,dur/1e6,name from slice WHERE name like '%doFrame%' order by dur desc limit 100

2

1查询的基础上,指定process name为systemui,即systemui自身的绘帧信息

select slice_id,track_id,ts,dur,dur/1e6,slice.name from slice JOIN thread_track ON slice.track_id = thread_track.id JOIN thread USING(utid) JOIN process USING(upid) WHERE process.name = 'com.android.systemui' and slice.name like '%doFrame%' order by dur desc limit 100

3

system_server中各OPF:关键字片段的耗时信息,包含各片段的真实running_time(每个slice可能有一段时间running,一段时间sleep,一段时间runnable,需要借助thread_state表来查询slice中各调度时间片的状态)

select slice_id,track_id,thread.utid,slice.ts,slice.dur,(slice.dur/1e6) as dur_ms, (select total(case when thread_state.ts < slice.ts then MIN(slice.ts+slice.dur,thread_state.ts+thread_state.dur)-slice.ts when (thread_state.ts+thread_state.dur) > (slice.ts+slice.dur) then (slice.ts+slice.dur-MAX(thread_state.ts,slice.ts)) else thread_state.dur end) from thread_state where thread_state.utid=thread.utid and thread_state.state='Running' and thread_state.ts < (slice.ts+slice.dur) and (thread_state.ts+thread_state.dur) > slice.ts)/1e6 as total_running,slice.name from slice JOIN thread_track ON slice.track_id = thread_track.id JOIN thread USING(utid) JOIN process USING(upid) WHERE process.name='system_server' and slice.name like 'OPF:%' order by slice.dur desc limit 400

4

system_server中的锁竞争情况(lockcontention),lock_depth表示当时参与此对象锁竞争的线程个数

select count(1) as lock_depth, s.slice_id,s.track_id,s.ts,s.dur,s.dur/1e6 as dur_ms,ctn.otid,s.name

from slice s, (select slice_id,track_id,ts,dur,name,substr(name, 46, instr(name,')')-46) as otid 

from slice t

WHERE name like 'Lock contention on a monitor lock %'

order by dur) ctn

JOIN thread_track ON s.track_id=thread_track.id JOIN thread USING(utid) JOIN process USING(upid)

WHERE

    process.name = 'system_server'

and s.name like 'Lock contention on a monitor lock %'

    and substr(s.name, 46, instr(s.name,')')-46) = ctn.otid

    and ctn.slice_id <> s.slice_id

    and ctn.ts >= s.ts and (ctn.ts+ctn.dur) <= (s.ts+s.dur)

group by s.slice_id

order by s.dur desc

四、小结

通过本篇文章希望读者能够了解Perfetto日志获取及常规分析方法,熟悉Perfetto UI界面各种功能,掌握Perfetto日志的SQL分析方法。后续建议结合代码了解常见trace tag/counter的意义,在具体场景中逐步深入了解系统框架运行机制及原理,提升性能分析及优化的能力。

五、附录

1. 常用快捷键

e0e45471107bc0cb6fef9655e7ee897d.png

2. WIN10 WSL及Ubuntu 20.04安装

以管理员身份打开 PowerShell 并运行:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

命令执行完成后,重启。

下载Ubuntu 20.04安装包,并安装 (或 wsl --install -d Ubuntu-20.04 )

https://aka.ms/wslubuntu2004

安装完后,开始菜单找到Ubuntu 20.04,点击即可启动 Ubuntu shell。

参考链接:

https://docs.microsoft.com/zh-cn/windows/wsl/install-win10#manual-installation-steps

https://docs.microsoft.com/zh-cn/windows/wsl/install-manual

3. 手机中抓取perfetto trace方法(Traceur app)

A. 开启开发人员选项,找到并点击系统跟踪,打开以下开关

【类别】建议选中 am、aidl、binder_driver、binder_lock、bionic、freq、gfx、hal、input、res、sched、ss、view、wm。

86317429a314db7584cab7ef7391abdd.png

B. 点击 【录制系统跟踪】,即可开始测试,点击通知栏 系统跟踪图标 停止记录trace日志。

C. 运行如下命令,取出录制的trace文件

adb pull /data/local/traces

清除已录制的trace日志 (每次重测前先清除之前录制的trace)

adb shell "rm -rf /data/local/traces/*"

清除操作也可以 点击开发人员选项,在 系统跟踪 中点击 【清除已保存的跟踪记录】

4. 参考链接

https://perfetto.dev/docs/

https://docs.microsoft.com/zh-cn/windows/wsl/install-manual

e4a131ced6cc4387e3159818f0126322.gif

长按关注内核工匠微信Linux 内核黑科技 | 技术文章 | 精选教程

来源地址:https://blog.csdn.net/feelabclihu/article/details/126672666

--结束END--

本文标题: Perfetto分析进阶

本文链接: https://lsjlt.com/news/405163.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Perfetto分析进阶
    一、Perfetto介绍 Perfetto是Android Q中引入的全新下一代平台级跟踪工具,为Android、Linux和Chrome平台提供了一种通用的性能检测和跟踪分析工具集。其核心是引入了一种全新的用户空间到用户空间的跟...
    99+
    2023-09-12
    可视化 java python linux 大数据
  • 性能分析工具 之 Perfetto基本使用
            Perfetto是google从Android10开始引入的一个全新的平台级跟踪分析工具。适用于Android、Linux和Chrome的更加通用和复杂的用于性能检测和跟踪分析的生产级开源项目。在android系统中对性能分...
    99+
    2023-09-05
    android 性能优化
  • android 如何分析应用的内存(十三)——perfetto
    android 如何分析应用的内存(十三) 本篇文章是native内存的最后一篇文章——perfetto perfetto简介 从2018年始,android开发者峰会正式推出perfetto工具。从...
    99+
    2023-09-20
    perfetto heap_profile heap_profile反混淆 heap_profile符号化 android内存分析
  • HTML进阶知识的示例分析
    小编给大家分享一下HTML进阶知识的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!文档类型HTML5 <!DOCT...
    99+
    2024-04-02
  • composer进阶命令的示例分析
    这篇文章将为大家详细讲解有关composer进阶命令的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。composer 进阶命令composer dumpautoload当更新了项目composer...
    99+
    2023-06-14
  • Pytorch进阶操作的示例分析
    小编给大家分享一下Pytorch进阶操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、合并与分割1.cat拼接直接按照指定的dim维度进行合并,要求...
    99+
    2023-06-25
  • @EnableAsync的使用、进阶、源码分析
    @EnableAsync使用 基础使用 使用@EnableAsync开启异步切面,然后在异步调用的方法上加上@Asyc注解即可 @SpringBootApplication@EnableAsync /...
    99+
    2023-10-24
    java spring
  • Go语言进阶freecache源码分析
    这篇文章主要介绍“Go语言进阶freecache源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言进阶freecache源码分析”文章能帮助大家解决问题。00. 什么是 freecach...
    99+
    2023-07-06
  • vuex进阶知识点的示例分析
    这篇文章将为大家详细讲解有关vuex进阶知识点的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、 Gettercomputed:{   ge...
    99+
    2024-04-02
  • FreeRTOS进阶之任务切换完全分析
    目录FreeRTOS任务切换过程代码分析运行FreeRTOS过程FreeRTOS任务切换过程 FreeRTOS任务相关的代码大约占总代码的一半左右,这些代码都在为一件事情而努力,即找...
    99+
    2024-04-02
  • Java进阶之SPI机制的示例分析
    这篇文章将为大家详细讲解有关Java进阶之SPI机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言SPI的英文全称为Service Provider Interface,字面意思为服务提...
    99+
    2023-06-15
  • Vue进阶构造属性的示例分析
    小编给大家分享一下Vue进阶构造属性的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、Directive 自定义指令在 Vue 框架下的代码中,很少用到...
    99+
    2023-06-15
  • MySQL的进阶部分
    1.MySQL的表的约束 (1)数据完整性的介绍:   所谓的数据的完整性就是,数据的准确性和可靠性。可以通过添加完整性约束来提高数据的完整性: 实体完整性:为每一个实体(记录)确定一个唯一标识。 实现...
    99+
    2024-04-02
  • FreeRTOS进阶列表和列表项示例分析
    目录前言1.初始化列表2.初始化列表项4.将列表项插入到列表末端前言 FreeRTOS内核调度大量使用了列表(list)和列表项(list item)数据结构。我们如果想一探Free...
    99+
    2024-04-02
  • FreeRTOS进阶之调度器启动过程分析
    目录FreeRTOS基本程序架构启动FreeRTOS调度器Cortex-M3中断优先级SVC中断服务函数FreeRTOS基本程序架构 int main(void) { 必...
    99+
    2024-04-02
  • C++数据结构模板进阶实例分析
    本文小编为大家详细介绍“C++数据结构模板进阶实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++数据结构模板进阶实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。非类型模板参数模板参数分类类型形参...
    99+
    2023-06-29
  • 数据分析 | Pandas 200道练习题 进阶篇(1)
    文章目录 前期准备DA5 牛客网用户没有补全的信息DA6 查看牛客网哪些用户使用PythonDA7 牛客网Python用户的成就值DA8 文件最后用户的部分数据 好久没有更新数据...
    99+
    2023-09-01
    pandas 数据分析 python
  • Python可视化Tkinter进阶grid布局实例分析
    这篇文章主要讲解了“Python可视化Tkinter进阶grid布局实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python可视化Tkinter进阶grid布局实例分析”吧!1、g...
    99+
    2023-07-02
  • Python函数进阶的使用方法实例分析
    今天小编给大家分享一下Python函数进阶的使用方法实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、函数的命名空间...
    99+
    2023-06-30
  • Python Pandas 数据分析秘籍,助力职场进阶!
    Python Pandas 库是数据分析领域不可或缺的工具,它提供了强大的数据操作、清洗和分析功能。掌握 Pandas 秘籍可以显著提升数据分析效率,为职场进阶加分。 数据操作 数据读取和写入:利用 Pandas 的 read_csv(...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作