Perfetto分析进阶

这篇具有很好参考价值的文章主要介绍了Perfetto分析进阶。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、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,可视化,java,python,linux,大数据

Perfetto UI

perfetto,可视化,java,python,linux,大数据

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

perfetto,可视化,java,python,linux,大数据

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

perfetto,可视化,java,python,linux,大数据

3. 常规分析

a. 图例指标

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

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

perfetto,可视化,java,python,linux,大数据

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

perfetto,可视化,java,python,linux,大数据

sched/freq (CPU调度、频率)

perfetto,可视化,java,python,linux,大数据

thread_state (线程状态)

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

perfetto,可视化,java,python,linux,大数据

点击

perfetto,可视化,java,python,linux,大数据

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

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

perfetto,可视化,java,python,linux,大数据

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

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

perfetto,可视化,java,python,linux,大数据

b. 添加标记

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

perfetto,可视化,java,python,linux,大数据

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

c. 锁竞争(lock contention)

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

perfetto,可视化,java,python,linux,大数据

三、SQL查询与展现

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

perfetto,可视化,java,python,linux,大数据

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

perfetto,可视化,java,python,linux,大数据

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

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

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

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

dur:片段持续时长(ns)

track_id属于哪个track(水平timeline)

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

perfetto,可视化,java,python,linux,大数据

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

perfetto,可视化,java,python,linux,大数据

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

perfetto,可视化,java,python,linux,大数据

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

perfetto,可视化,java,python,linux,大数据

sched_slice,线程调度片段

perfetto,可视化,java,python,linux,大数据

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

perfetto,可视化,java,python,linux,大数据

列举几个常用的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. 常用快捷键

perfetto,可视化,java,python,linux,大数据

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文章来源地址https://www.toymoban.com/news/detail-781281.html

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

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

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

perfetto,可视化,java,python,linux,大数据

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

长按关注内核工匠微信


Linux 内核黑科技 | 技术文章 | 精选教程

到了这里,关于Perfetto分析进阶的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android中如何通过perfetto抓取trace

    一,perfetto的作用 Perfetto的作用是提供一个性能检测和跟踪分析工具集 ,用于Android、Linux和Chrome平台。 Perfetto是Google推出的一款全新的平台级跟踪分析工具,它从Android 10开始被引入,旨在替代之前的systrace工具。Perfetto的核心特点包括用户空间到用户空间的跟踪协议,基于p

    2024年02月21日
    浏览(42)
  • 探索Perfetto:开源性能追踪工具的未来之光

    A. 介绍Perfetto的背景和作用 随着移动应用、桌面软件和嵌入式系统的不断发展,软件性能优化变得愈发重要。在这个背景下,Perfetto作为一款开源性能追踪工具,日益引起了开发者们的关注。Perfetto旨在帮助开发者更好地了解应用程序和系统的性能状况,从而优化性能,提升用

    2024年02月12日
    浏览(40)
  • Perfetto 命令行工具(Android 10 及更高版本)

    Perfetto 基于自 Android 9 (P) 以来可用的平台服务,但默认情况下仅在 Android 11 (R) 。 在 Android 9 (P) 和 10 (Q) 上,您需要执行以下操作以确保 在开始之前启用跟踪服务: 命令行工具: 使用 tools/record_android_trace 帮助程序脚本。 直接使用设备上的命令: /system/bin/perfetto 用

    2024年02月12日
    浏览(47)
  • 深入 Seaborn:Python 数据可视化进阶

    在上一篇介绍 Seaborn 的文章中,我们讨论了一些基础的可视化工具,例如直方图,以及如何使用 Seaborn 控制图形的样式和颜色。在这篇文章中,我们将深入 Seaborn 的中级使用,包括创建复杂的统计图形,如散点图矩阵、箱线图和小提琴图等。 Seaborn 的 pairplot 函数可以创建一个

    2024年02月16日
    浏览(44)
  • python数据分析及可视化(十四)数据分析可视化练习-上市公司可视化数据分析、黑色星期五案例分析

    从中商情报网下载的数据,表格中会存在很多的问题,查看数据的信息有无缺失,然后做数据的清晰,有无重复值,异常数据,省份和城市的列名称和数据是不对照的,删除掉一些不需要的数据,省份不完整的数据,然后进行数据分析以及可视化,如上市公司中的行业Top5,用

    2024年02月03日
    浏览(58)
  • 【数据挖掘与人工智能可视化分析】可视化分析:如何通过可视化技术进行数据挖掘和发现

    作者:禅与计算机程序设计艺术 数据挖掘(Data Mining)和人工智能(Artificial Intelligence,AI)已经成为当今社会热点话题。这两者之间的结合也带来了很多挑战。作为数据科学家、机器学习工程师、深度学习研究员等,掌握了数据的获取、清洗、处理、建模、应用这些技术的前提下,

    2024年02月07日
    浏览(78)
  • python基于大数据的手机分析系统与可视化 -可视化大屏分析

    前言 该系统采用了多种数据源,包括用户行为数据、社交数据、市场趋势数据等,通过数据挖掘、统计分析等手段,对这些数据进行分析和建模。其中,用户行为数据包括用户使用手机的频率、时间、地理位置、应用使用情况等,社交网络数据包括用户在交网络上的行为、好

    2024年02月03日
    浏览(48)
  • 【数据分析与可视化】利用Python对学生成绩进行可视化分析实战(附源码)

    需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 下面对学生成句和表现等数据可视化分析 1:导入模块 2:获取数据 并打印前四行  属性列表对应含义如下 Gender  性别 Nationality  国籍 PlaceofBirth 出生地 Stageid 学校级别 Gradeid 年级 Sectionid  班级 Topic 科目 semester 学期 ra

    2024年02月03日
    浏览(50)
  • 大数据可视化——基于Python豆瓣电影数据可视化分析

    本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示,构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据,我们提供了一个全面的电影信息平台,为用户提供深入了解电影产业趋势、影片评价与演员表现的工具。项目的关键步骤包括

    2024年02月04日
    浏览(83)
  • 可视化绘图技巧100篇进阶篇(十)-股价图(K线图)(一)

      目录 前言 适用场景 图例 绘图工具及代码实现     EXCEL Python绘制股价趋势图

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包