Perfetto for linux-使用 Perfetto 分析调度问题

2023-05-16


title: Perfetto for linux-使用 Perfetto 分析调度问题
date: 2020-11-21 22:40
author: gatieme
tags:
- scheduler
- linux
- debug
categories:
- scheduler
thumbnail:
blogexcerpt:
Perfetto 工具是 Android 下一代全新的统一的 trace 收集和分析框架, 在 Android 9.0(API级别28)或更高版本的设备上, 可以使用 System Tracing 的 System App 在设备上记录系统跟踪, 可以抓取平台和app的 trace 信息, 是用来取代 systrace 的, 但 systrace 由于历史原因也还会一直存在, 并且 Perfetto 抓取的 trace 文件也可以同样转换成 systrace 视图.


CSDNGitHubBlog知乎掘金
紫夜阑珊-青伶巷草debug/tools/perfettoOS 内核实验室3589560936978869597248159757

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作

因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调试工具以供收录, 鄙人在此谢谢啦


日期更新
2021/03/20将 1.3 节 关于信息安全问题 展开讲解

1 Perfetto 概述


1.1 为什么需要 Perfetto


Perfetto 工具是 Android 下一代全新的统一的 trace 收集和分析框架, 在 Android 9.0(API级别28)或更高版本的设备上, 可以使用 System Tracing 的 System App 在设备上记录系统跟踪, 可以抓取平台和app的 trace 信息

perfetto_leggcy_ui

虽然 Perfetto 是用来取代 systrace 的, 但 systrace 由于历史原因也还会一直存在, 并且 Perfetto 抓取的 trace 文件也可以同样转换成 systrace 视图.

如果习惯用 systrace 的, 可以用 Perfetto UI 的 Open with legacy UI 转换成 systrace 视图来看

perfetto_leggcy_ui

1.2 Perfetto 优点


  1. 支持 Android 和 Linux 上的全系统跟踪, 可以在线抓取长时间(可达数小时)的 trace, 子系统跟踪处理器 专门设计用于将数小时的跟踪数据有效地保存到本地中, 并基于流行的SQLite查询引擎公开SQL查询接口支持 SQL 查询. 这样就可以在后台开启, 让它一直抓取 trace 了, 特别适用于那种复现概率很低, 又比较严重的性能问题.

  2. Perfetto 具有很好的可扩展性, 它除了支持标准的 tracepoints(例如CPU调度信息, 内存信息等)之外, 还可以监听系统的多种信息, 比如 procfs 以及 sysfs 接口等; 还可以通过 atrace HAL 层扩展, 在 Android P当中, Google新增加了一个 atrace HAL 层, atrace 进程可以调用这个HAL的接口来获取当前的扩展信息, 比如添加用于记录电池和电量使用的统计信息, 程序的执行路径等. 相关代码可见 Google 提交, 这样如果需要扩展 tracepoints 的话, 就可以按照 graphic 的示例添加即可.

  3. 提供全新的 Perfetto UI 网站, 用于打开的跟踪, 并通过浏览器在本地处理, 不需要任何服务器端交互. 可以在上面通过选取开关的方式, 自动生成抓取 trace 的命令, 同时可以打开 trace 文件. 另外还集成了几种预定义的 trace 分析统计工具, 详情可见它的 Metrics and auditors 选项

Perfetto 本身是一个框架, 关于它的架构和模块的详细介绍, 可以参考它的 doc 网站, 它的源码可以参考 Android Source Tree 的 /external/perfetto 目录, 里面有很多的tools, 配置和脚本等, 可以拿来直接使用.

1.3 关于信息安全问题


注意
【请知悉】

本文虽然是在介绍 perfetto 工具, 但是

  1. 用 perfetto 进行数据分析, 数据是否会被传回 google 服务器, 未经考证;

  2. perfetto 抓取的日志中的确包含机器的一些信息;

  3. perfetto 的数据存储格式无法直接解析, 具体涉及的信息也未经剖析;

所以如果是涉密的数据(比如你在未发布的机器/服务器/开发板/手机等终端产品上抓取的日志).

  1. 没有数据证明, 该数据不会被收集分析.

  2. 因此如果设备或者数据涉及信息安全的相关内容, 请谨慎使用.

2021/03/20 更新(之前一直纠结于是否更新这段内容, 前段时间跟同事讨论 perfetto 的时候, 说到信息安全问题同时也提到这段内容, 所以今天更新下, 说下自己的理解).
之前在查阅 google perfetto 的文档的过程中发现了如下描述:

The Perfetto UI works fully offline after it has been opened once. Traces opened with the UI are processed locally by the browser and do not require any server-side interaction.

上面提到整个 Perfetto UI 打开一次之后就完全脱机运行了, trace 数据的处理都是在本地进行的, 不会做任何服务器请求.

可以看到 Perfetto UI 的确不是一个本地的网址. 虽然有上述的声明, 但是鉴于国内外信息安全的一贯环境和形势, 建议大家的环境和数据如果涉及隐私信息, 还是谨慎为妙. 毕竟不作恶并不是真的不作恶.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5qUuBzhX-1616169787582)(https://raw.githubusercontent.com/gatieme/LDD-LinuxDeviceDrivers/master/study/debug/tools/perfetto/01-description/ping_perfetto_ui.png)]

详细信息参见: Perfetto - System profiling, app tracing and trace analysis.

当然 perfetto 也为大家提供了自建服务的方式, 参见 build-instructions. 如果担心信息泄露, 建议还是使用自建的服务比较稳妥. 后期我也考虑有时间就自建 peretto 服务写一篇技术分享.

博主在此提醒, 如果因为不慎使用导致的问题, 本博主不承担任何责任.

由于我对网络安全不甚了解, 也欢迎有意愿的同学, 可以抓下 perfetto 使用过程中的网络请求, 确认下当前版本是否有数据传回.

谢谢大家, 小弟在此不甚感激.

2 Android 上使用 perfetto


2.1 使能 perfetto


由于 Perfetto 有一套服务框架, 为了捕获跟踪, 需要运行traced(会话守护程序)和traced_probes(探测和ftrace-interop守护程序).

默认情况下, 这些服务是没有开启的, 可以看下手机上有没有这两个进程运行来确认这点.

adb shell "ps -ef | grep -E "traced|traced_probes" | grep -v grep"

如果没有这两个服务在运行, 那么可以使用如下命令来启用 perfetto

adb shell setprop persist.traced.enable 1

2.2 抓取 trace


跟 systrace 一样, Perfetto 为我们提供了两种方式来抓取 trace 日志.

  1. 通过 Perfetto UI 中的记录页面, 参照 Quickstart: Record traces on Android.

  2. 使用 perfetto命令行 界面.

我们自然使用 perfetto CLI 命令行方式来抓取.

参数使用描述
–out用来指定 trace 输出文件
–config用来指定配置, 例如抓多长时间, 间隔多久把内存数据写回文件, 抓取哪些 tracepoints 等等, config 文件内容, 可以自己手动编写, 也可以用 Perfetto UI网站生成
adb shell perfetto --config :test --out /data/misc/perfetto-traces/trace //使用内置的test配置, 然后输出到/data/misc/perfetto-traces/trace

另外在 Perfetto 里面默认集成了一个 test 配置, 可以使用如下命令抓取一个使用 test config 的 trace 文件

3 服务器上使用 perfetto


3.1 编译 perfetto


下载 perfetto 核心代码

git clone https://android.googlesource.com/platform/external/perfetto/ && cd perfetto

下载并提取构建依赖项:

tools/install-build-deps

如果脚本因SSL错误而失败, 请尝试以方式调用该脚本 python3 tools/install-build-deps, 或升级您的openssl库.

生成所有最常见的GN构建配置:

tools/build_all_configs.py

构建Linux跟踪二进制文件(在Linux上, 它使用密封的clang工具链, 作为步骤2的一部分下载):

tools/ninja -C out/linux_clang_release traced traced_probes perfetto

使用tools/tmux下面的便捷脚本时, 此步骤是可选的.

3.2 使用 perfetto


perfetto 是一个命令行工具, 在shell环境下执行, 他依赖于系统中运行的的两个服务进程 traced 和 traced_probes 来完成工作.

Android 通过启用 perfetto 服务来自动运行 traced(会话守护程序)和traced_probes(探测和ftrace-interop守护程序).
但是 Linux 系统中我们必须手动将这两个服务启动起来.

3.2.1 一键式 tmux 脚本


perfetto 为我们提供了 tools/tmux 脚本来完成类似与 Android 上类似的工作, 帮我们启动服务进程, 并设置一个工作面板.

我们可以使用如下命令通过 tools/tmux 脚本来抓取 10S 调度的日志

OUT=out/linux_clang_release CONFIG=test/configs/scheduling.cfg tools/tmux -n

perfetto cli 工具运行时候, 需要制定 config 文件, perfetto 默认为我们提供了多个配置模板, 位于仓库路径下 test/configs 目录下.
上面我们使用的是默认提供的 scheduling 的配置, 我们也可以自定义 config 或者用 perfeto ui 生成 config.

脚本首先将我们需要的服务程序和 perfetto CLI 工具及其依赖库都拷贝到了 TMP 目录下 /tmp/perfetto.xxxxxx.
然后使用 tmux 帮我们打开了一个有三个面板的 TMUX 窗口, 从上往下分别启动了: traced, traced_probes 和 perfetto 抓取日志的工作台.
在最底下的 perfetto 工作面板中, 已经为我们预先填好了抓取 perfetto 的命令, 我们只需要回车就可以抓取 10S 调度日志.

[本处原来有图片, 动图超出大小无法上传)(https://raw.githubusercontent.com/gatieme/LDD-LinuxDeviceDrivers/master/study/debug/tools/perfetto/perfetto_run_tmux.gif)]

我们可以使用 Ctrl-B D 退出这个tmux会话
也可以使用 tmux attach -t demo, 来重新连接大这个 tmux 会话.
使用关闭它 tmux kill-session -t demo.
更过关于 tmux 的操作, 请参照博主的另外一篇博客 linux下的终端利器----tmux.
注意请不要使用 tmux 这篇博客中提供的配置文件, 这篇博客中重新绑定了快捷键, 否则你可能需要重新修改 tmux 脚本或者配置文件.

脚本会将跟踪到的日志信息以二进制的格式存在到的 protobuf 中, 参照 TracePacket

3.2.2 手动运行服务


前面使用 tmux 运行了之后, 我们就清楚的知道启动了那些服务, 以及 perfetto 抓取的命令.

手动将服务后台启起来, 然后运行 perfetto, 指定 config, 抓取 trace 日志.

如下所示:

cd out/linux_clang_release

./traced_probes &

./traced &

./perfetto --txt -c ../../test/configs/scheduling.cfg  -o trace

4 perfetto 的一些技巧


4.1 自定义Config


目前最方便的配置文件生成方式是使用Perfetto UI 网站来帮助生成, 点击 Record new trace 会看到有很多的配置界面
选择想要的 tracepoints 之后 点击 Trace Command, 将命令内容拷贝出来直接在终端就可以执行.

perfetto_trace_command

4.2 使用 SQL 查询和分析日志


子系统 TraceProcessor 基于 SQLite 为 Perfetto 提供了查询和分析数据的能力.
又作为独立的可执行文件提供: trace_processor.

关于这部分的详细信息可以参照 Quickstart: SQL-based analysis and trace-based metrics

4.3 trace 格式转换工具


Perfetto 提供了一个兼容的 UI 来打开 原来的 systrace, 参见 catapult_trace_viewer.
不过毕竟是要替代 systrace 的, 因此使用起来有一丢丢问题, 而且也不能打开太的 systrace 文件.

不过 Perfetto 也提供了一些方法, 让你把你抓到的日志转换成 systrace 格式.

  • 提供的 traceconv 工具将 Perfetto 跟踪转换为其他跟踪格式.

  • 点击 Perfetto 界面的 Legacy UI, 就会把你的日志转换成 systrace 格式并用 catapult_trace_viewer 打开. 你可以点击 save 把你的 systrace 日志保存下来.

5 参考资料


Perfetto工具使用简介

(两百五十七) 学习perfetto(二)——生成perfetto trace

Perfetto使用

android-app-performance-analysis-with-perfetto

perfetto docs

(七) 下篇 Android 性能优化 Perfetto 详细介绍


  • 本作品/博文 ( AderStep-紫夜阑珊-青伶巷草 Copyright ©2013-2017 ), 由 成坚(gatieme) 创作.

  • 采用知识共享许可协议知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 欢迎转载、使用、重新发布, 但务必保留文章署名成坚gatieme ( 包含链接: http://blog.csdn.net/gatieme ), 不得用于商业目的.

  • 基于本文修改后的作品务必以相同的许可发布. 如有任何疑问, 请与我联系.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perfetto for linux-使用 Perfetto 分析调度问题 的相关文章

  • Linux中线程的同步与互斥、生产者消费模型和读者写者问题、死锁问题

    线程的同步与互斥 线程是一个存在进程中的一个执行控制流 xff0c 因为线程没有进程的独立性 xff0c 在进程内部线程的大部分资源数据都是共享的 xff0c 所以在使用的过程中就需要考虑到线程的安全和数据的可靠 不能因为线程之间资源的竞争
  • 解决The following packages have unmet dependencies问题!!!

    1 安装包的时候出现如下情况 xff08 缺少依赖 xff09 xff1a 2 解决方案 xff1a 尝试多种方法无果 xff0c 最终借助一个强大的包管理工具 xff08 aptitude xff09 终于成功了 xff01 xff01
  • linux的开机过程

    1 主机加电自检 xff0c 加载 BIOS 硬件信息 2 读取 MBR 的引导文件 GRUB LILO 3 引导 Linux 内核 4 运行第一个进程 init 进程号永远为 1 5 进入相应的运行级别 6 运行终端 xff0c 输入用户
  • Ubunt 20.04 使用CDROM或ISO作为安装源

    有些项目由于安全性的要求 xff0c 需要部署在没有互联网环境的内网中 xff0c 那么如何在离线环境中给ubuntu安装相关的软件就是考验大家的linux基础知识的时候了 本文就带领大家利用CDROM或者挂载ISO镜像两种方式配置ubun
  • 关于Intellij idea 报错:Error : java 不支持发行版本5的问题

    在Intellij idea中新建了一个Maven项目 xff0c 运行时报错如下 xff1a Error java 不支持发行版本5 本地运行用的是JDK9 xff0c 测试Java的Stream操作 xff0c 报错应该是项目编译配置使
  • Spring之配置类源码深度解析

    这篇文章是继 Spring之启动过程源码解析之后 xff0c 对Spring启动过程中用到的几个重要的方法进行详细的解读 目录 一 invokeBeanFactoryPostProcessors xff0c 执行BeanFactoryPos
  • 20210702剑指Offer03(数组中重复数字)

    找出数组中重复的数字 输入 xff1a 2 3 1 0 2 5 3 输出 xff1a 2 或 3 span class token keyword class span span class token class name Solutio
  • react异步数据如ajax请求应该放在哪个生命周期?

    对于同步的状态改变 xff0c 是可以放在componentWillMount xff0c 对于异步的 xff0c 最好好放在componentDidMount 但如果此时有若干细节需要处理 xff0c 比如你的组件需要渲染子组件 xff0
  • RabbitMQ exchange交换机机制

    目录 RabbitMQ 概念exchange交换机机制 什么是交换机binding xff1f Direct Exchange交换机Topic Exchange交换机Fanout Exchange交换机Header Exchange交换机R
  • 解决open-vm-tools无法复制粘贴文件问题

    在使用vmware kali linux时一直忍受着一个情况 xff1a open vm tools Error when getting information for file 34 tmp VMwareDnD 3jTONh xxx N
  • mipmap 和 drawable 的区别

    Android 在 API level 17 加入了 mipmap 技术 xff0c 对 bitmap 图片的渲染支持 mipmap 技术 xff0c 来提高渲染的速度和质量 mipmap 是一种很早就有的技术了 xff0c 翻译过来就是纹
  • LSTM与GRU

    LSTM 与 GRU 一 综述 LSTM 与 GRU是RNN的变种 xff0c 由于RNN存在梯度消失或梯度爆炸的问题 xff0c 所以RNN很难将信息从较早的时间步传送到后面的时间步 LSTM和GRU引入门 xff08 gate xff0
  • Pytorch 实战RNN

    一 简单实例 span class token comment coding utf8 span span class token keyword import span torch span class token keyword as
  • Pytorch : Dataset和DataLoader

    一 综述 Dataset 对数据进行抽象 xff0c 将数据包装为Dataset类 DataLoader 在 Dataset之上对数据进行进一步处理 xff0c 包括进行乱序处理 xff0c 获取一个batch size的数据等 二 Dat
  • 特征工程

    一 数据读取 1 1 读取CSV文件 1 1 1 原文件内容 1 1 2 读取csv span class token keyword import span csv csv file span class token operator 6
  • 代码命名规范

    代码命名规范 现在是2016年12月30日中午12点35分 xff0c 这是我第一次写博客 xff0c 用的是markdown编辑器 xff0c 还不太会用 今天就先简单的写一下 xff0c 看看写出来的效果是什么样的 xff01 xff0
  • Ubuntu18.04 离线安装nginx

    由于服务器位于内网环境且无法访问互联网 xff0c 需要离线安装nginx xff0c ubuntu18 04离线安装软件也并不复杂 xff0c 只是需要较大的耐心去搜集所需的包 xff0c 不过大家不用担心 xff0c 我已经为大家准备好
  • easyui combobox动态绑定数据

    1 jsp上的写法 lt input span class hljs keyword class span 61 span class hljs string 34 easyui combobox 34 span id 61 span cl
  • Echarts(二、柱状图(各参数详细描述))

    1 jsp页面 span class hljs tag lt span class hljs title body span gt span span class hljs tag lt span class hljs title div
  • js中级脚本算法

    1区间求值算法挑战 span class hljs function span class hljs keyword function span span class hljs title sumAll span span class hl

随机推荐