Systrace的工作原理
Systrace的工作原理
转:https://www.jianshu.com/p/6f528e862d31
Systrace的工作原理
译文地址:https://source.android.com/devices/tech/debug/systrace
systrace是一个分析android性能问题的基础工具,但本质上是其他某些工具的封装,包括:PC端的atrace,设备端的可执行文件(用于控制用户控件的追踪以及配置ftrace,即Linux内核中的主要跟踪机制)。Systrace使用atrace开启追踪,然后读取ftrace的缓存,并且把它重新转换成HTML格式。
systrace由Google Android和Google Chrome共同开发,为Catapul开源t项目的一部分。 除了systrace,Catapult还包括其他有用的工具。 例如,ftrace相比与systrace和atrace具有更多的功能,并且包含一些对调试性能问题至关重要的高级功能。 (这些功能需要root权限)
运行systrace
在Pixel/Pixel XL上调试震动时,可以通过以下命令:
./systrace.py sched freq idle am wm gfx view sync binder_driver irq workq input -b 96000
当systrace与GPU和显示管道活动所需的附加跟踪点结合使用时,您可以跟踪所有从用户输入到屏幕显示的帧。设置大的缓冲区可以避免事件的丢失(通常表现为某些CPU在跟踪中的某个点之后没有任何事件)。
当使用systrace时,注意每个事件都是在CPU上触发的。
注意:硬件中断不受CPU控制也不会在ftrace中触发事件,实际提交到跟踪日志是由中断处理程序完成的,但一些损坏的驱动会造成中断的延迟,因此最关键点因素还是CPU本身。
因为systrace构建在ftrace之上,ftrace在CPU上运行,所以硬件改变log必然会写入到的ftrace缓冲区。这就意味着如果你好奇为什么显示栏改变了,那么你可以看CPU在该转换点上的运行内容(CPU上运行的事件均被保存到log中)。这个概念是使用systrace分析性能的基础。
例子:working frame
这是一个描述正常UI管道过程的systrace,请事先下载好zip文件,点击下载zip文件,解压并在浏览器中打开systrace_tutorial.html,注意:这个文件要比一般的html文件大得多。
对于一个持续的定期的工作负载,例如TouchLatency,UI管道,通常包含以下阶段:
- SurfaceFlinger中的EventThread唤醒了应用程序UI线程,表明现在是渲染新帧的时候了。
- 应用程序使用CPU和GPU资源在UI线程,RenderThread和hwuiTasks中渲染帧。这部分暂UI的大部分。
- 应用程序通过binder将绘制好的帧发送到SurfaceFlinger并进入睡眠状态。
- SurfaceFlinger中的第二个EventThread唤醒SurfaceFlinger来触发组合和显示输出。如果SurfaceFlinger确定没有任何工作要完成,它将返回睡眠状态。
- SurfaceFlinger通过HWC / HWC2或GL处理组合。 HWC / HWC2组合更快,更低的功耗,但会受到SOC的限制。这一步通常需要4-6ms,但是可以与步骤2重叠,因为Android应用程序总是三重缓冲。 (虽然应用程序总是三重缓冲,但在SurfaceFlinger中只能有一个待处理帧,因此和双重缓存差不多。)
- SurfaceFlinger通过供应商驱动程序调度最终输出,并返回睡眠状态,等待EventThread唤醒。
让我们从15409ms开始查看帧:
图1 正常的UI以及EventThread
图1是正常的帧(对应阶段1),要了解UI管道如何工作这是一个很好的示范。 TouchLatency的UI线程行在不同时间包含不同的颜色。 不同的线代表线程的不同状态:
灰色: 睡眠。
蓝色: 可以运行(它可以运行,但还未被调度运行)。
绿色: 正在运行(调度程序认为它正在运行)。
注意:中断处理程序没有CPU时间轴中显示,因此在线程运行的过程中虽然没有显示中断,但实际上你可能已经执行了终端或者softirqs,最终需要通过检查trace(进程0)来判断终端是否发生。
红色: 不间断的睡眠(通常发生在内核锁上), 指出I / O负载,对于性能问题的调试非常有用。
橙色: 由于I / O负载导致的不间断睡眠。
要查看不间断睡眠的原因(可从sched_blocked_reason跟踪点获取),请选择红色不间断睡眠切片。
当EventThread正在运行时,TouchLatency的UI Thread就变成了可以运行的蓝色。 要查看是什么,请点击蓝色部分:
图2 TouchLatency的UI线程
图2(对应阶段1) 显示的是EventThread运行后,TouchLatency的tid6843唤醒UIThread为其工作,这一个信息可以从下方的“wakeup from tid:6843”看出
图3 (对应阶段2)UI线程被唤醒,开始渲染帧,然后插入SurfaceFlinger的绘制帧队列
如果'binder_drivier'tag被开启后,你可以选择binder transaction来查看整个过程。
图4(对应阶段3) Binder transaction
图4(对应阶段3) Binder transaction
如图4所示,在15423ms处,SurfaceFlinger的Binder:6832_1由于pid9579的调用变为了可运行状态。在binder tracsaction的两侧你也可以看到缓冲队列。
在SurfaceFlinger的queueBuffer中,TouchLtency的待绘制帧数量从1变为了2.
图5(对应阶段3) 待处理帧从1到2。
图5显示了三重缓冲,其中有两个完整的帧,应用程序将很快开始渲染第三个帧。 这是因为我们已经删除了一些帧,所以应用程序会保留两个挂起的帧而不是一个帧,以避免跳帧。
随后,SurfaceFlinger的主线程被第二个EventThread唤醒,因此它可以将的待处理帧输出到显示器:
图6(阶段4) SurfaceFlinger的主线程由第二个EventThread唤醒。
SurfaceFlinger首先锁定较早的待绘制缓冲区,这将导致挂起的缓冲区数从2减为1:
图7(阶段4)SurfaceFlinger绘制最早的待绘制缓冲帧
锁定缓冲区后,SurfaceFlinger进行组装并显示新帧。
图8(阶段5). SurfaceFlinger进行组装并提交最终的框架。
接下来,'mdss_fb0'在CPU 0上唤醒。'mdss_fb0'是显示管道的内核线程,用于将渲染的帧输出到显示器。 我们可以看到’mdss_fb0‘的信息(向下滚动查看)。
图9(阶段6)'mdss_fb0'唤醒CPU0
作者:一叶一声秋
链接:https://www.jianshu.com/p/6f528e862d31
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Systrace的工作原理
译文地址:https://source.android.com/devices/tech/debug/systrace
systrace是一个分析android性能问题的基础工具,但本质上是其他某些工具的封装,包括:PC端的atrace,设备端的可执行文件(用于控制用户控件的追踪以及配置ftrace,即Linux内核中的主要跟踪机制)。Systrace使用atrace开启追踪,然后读取ftrace的缓存,并且把它重新转换成HTML格式。
systrace由Google Android和Google Chrome共同开发,为Catapul开源t项目的一部分。 除了systrace,Catapult还包括其他有用的工具。 例如,ftrace相比与systrace和atrace具有更多的功能,并且包含一些对调试性能问题至关重要的高级功能。 (这些功能需要root权限)
运行systrace
在Pixel/Pixel XL上调试震动时,可以通过以下命令:
./systrace.py sched freq idle am wm gfx view sync binder_driver irq workq input -b 96000
当systrace与GPU和显示管道活动所需的附加跟踪点结合使用时,您可以跟踪所有从用户输入到屏幕显示的帧。设置大的缓冲区可以避免事件的丢失(通常表现为某些CPU在跟踪中的某个点之后没有任何事件)。
当使用systrace时,注意每个事件都是在CPU上触发的。
注意:硬件中断不受CPU控制也不会在ftrace中触发事件,实际提交到跟踪日志是由中断处理程序完成的,但一些损坏的驱动会造成中断的延迟,因此最关键点因素还是CPU本身。
因为systrace构建在ftrace之上,ftrace在CPU上运行,所以硬件改变log必然会写入到的ftrace缓冲区。这就意味着如果你好奇为什么显示栏改变了,那么你可以看CPU在该转换点上的运行内容(CPU上运行的事件均被保存到log中)。这个概念是使用systrace分析性能的基础。
例子:working frame
这是一个描述正常UI管道过程的systrace,请事先下载好zip文件,点击下载zip文件,解压并在浏览器中打开systrace_tutorial.html,注意:这个文件要比一般的html文件大得多。
对于一个持续的定期的工作负载,例如TouchLatency,UI管道,通常包含以下阶段:
- SurfaceFlinger中的EventThread唤醒了应用程序UI线程,表明现在是渲染新帧的时候了。
- 应用程序使用CPU和GPU资源在UI线程,RenderThread和hwuiTasks中渲染帧。这部分暂UI的大部分。
- 应用程序通过binder将绘制好的帧发送到SurfaceFlinger并进入睡眠状态。
- SurfaceFlinger中的第二个EventThread唤醒SurfaceFlinger来触发组合和显示输出。如果SurfaceFlinger确定没有任何工作要完成,它将返回睡眠状态。
- SurfaceFlinger通过HWC / HWC2或GL处理组合。 HWC / HWC2组合更快,更低的功耗,但会受到SOC的限制。这一步通常需要4-6ms,但是可以与步骤2重叠,因为Android应用程序总是三重缓冲。 (虽然应用程序总是三重缓冲,但在SurfaceFlinger中只能有一个待处理帧,因此和双重缓存差不多。)
- SurfaceFlinger通过供应商驱动程序调度最终输出,并返回睡眠状态,等待EventThread唤醒。
让我们从15409ms开始查看帧:
图1 正常的UI以及EventThread
图1是正常的帧(对应阶段1),要了解UI管道如何工作这是一个很好的示范。 TouchLatency的UI线程行在不同时间包含不同的颜色。 不同的线代表线程的不同状态:
灰色: 睡眠。
蓝色: 可以运行(它可以运行,但还未被调度运行)。
绿色: 正在运行(调度程序认为它正在运行)。
注意:中断处理程序没有CPU时间轴中显示,因此在线程运行的过程中虽然没有显示中断,但实际上你可能已经执行了终端或者softirqs,最终需要通过检查trace(进程0)来判断终端是否发生。
红色: 不间断的睡眠(通常发生在内核锁上), 指出I / O负载,对于性能问题的调试非常有用。
橙色: 由于I / O负载导致的不间断睡眠。
要查看不间断睡眠的原因(可从sched_blocked_reason跟踪点获取),请选择红色不间断睡眠切片。
当EventThread正在运行时,TouchLatency的UI Thread就变成了可以运行的蓝色。 要查看是什么,请点击蓝色部分:
图2 TouchLatency的UI线程
图2(对应阶段1) 显示的是EventThread运行后,TouchLatency的tid6843唤醒UIThread为其工作,这一个信息可以从下方的“wakeup from tid:6843”看出
图3 (对应阶段2)UI线程被唤醒,开始渲染帧,然后插入SurfaceFlinger的绘制帧队列
如果'binder_drivier'tag被开启后,你可以选择binder transaction来查看整个过程。
图4(对应阶段3) Binder transaction
图4(对应阶段3) Binder transaction
如图4所示,在15423ms处,SurfaceFlinger的Binder:6832_1由于pid9579的调用变为了可运行状态。在binder tracsaction的两侧你也可以看到缓冲队列。
在SurfaceFlinger的queueBuffer中,TouchLtency的待绘制帧数量从1变为了2.
图5(对应阶段3) 待处理帧从1到2。
图5显示了三重缓冲,其中有两个完整的帧,应用程序将很快开始渲染第三个帧。 这是因为我们已经删除了一些帧,所以应用程序会保留两个挂起的帧而不是一个帧,以避免跳帧。
随后,SurfaceFlinger的主线程被第二个EventThread唤醒,因此它可以将的待处理帧输出到显示器:
图6(阶段4) SurfaceFlinger的主线程由第二个EventThread唤醒。
SurfaceFlinger首先锁定较早的待绘制缓冲区,这将导致挂起的缓冲区数从2减为1:
图7(阶段4)SurfaceFlinger绘制最早的待绘制缓冲帧
锁定缓冲区后,SurfaceFlinger进行组装并显示新帧。
图8(阶段5). SurfaceFlinger进行组装并提交最终的框架。
接下来,'mdss_fb0'在CPU 0上唤醒。'mdss_fb0'是显示管道的内核线程,用于将渲染的帧输出到显示器。 我们可以看到’mdss_fb0‘的信息(向下滚动查看)。
图9(阶段6)'mdss_fb0'唤醒CPU0
作者:一叶一声秋
链接:https://www.jianshu.com/p/6f528e862d31
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Systrace的工作原理相关推荐
- 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...
- 深入理解Nginx工作原理
1 反向代理 1.1 概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给intern ...
- 高频开关电源原理_程控开关电源的工作原理
本文介绍了开关电源的工作原理以及它的特点. 程控开关电源要要比线性电源复杂得多. 下图是典型的开关电源工作原理图. 首先对 220 V/50Hz 的 AC 输入,通过桥式整流器进行整流 储能电容对整流 ...
- Servlet生命周期与工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
- java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?
近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...
- linux网络管理原理,Linux__网络管理(物理层 数据链路层 网络层工作原理)
千锋云计算逆战班11点后打卡 今天学习后,进行复习下,物理层 数据链路层 网络层 的工作原理 物理层关心的两件事情:1.信号 2.介质 先说信号:信号分为模拟信号和数字信号 模拟信号: 模拟信号,不 ...
- HDD工作原理 导图
以上导图介绍了我们使用的 (HDD)机械硬盘的基本构造以及核心工作原理,对于大家扫盲有所帮助 参考文档: https://blog.csdn.net/yizhaoxin/article/details ...
- 路由和交换机工作原理
路由器与交换机的工作原理 计算机网络往往由许多种不同类型的网络互连连接而成.如果几个计算机网络只是在物理上连接在一起,它们之间并不能进行通信,那么这种"互连"并没有什么实际意义.因 ...
- Google工作原理
今天在晚上看到一个图,讲解google的工作原理,感觉写的不错.贴过来方便以后深入的研究. 转载于:https://www.cnblogs.com/muyuge/archive/2010/07/06/ ...
- 【摄像头】摄像机工作原理
1.摄像机工作原理 外部光线穿过镜头(lens)后, 经过滤光片(color filter)滤波后照射到光学传感器(Sensor)上面, Sensor 将从 lens 上传导过来的光线转换为电信号,再 ...
最新文章
- 站在这山看着那山高,到了那山没柴烧.
- ue4是什么意思_恋爱中,男生最喜欢什么相处模式?
- 健康管理-健康管理特点
- 代码分析工具python_Python代码分析工具:PyChecker、Pylint
- 深入理解java虚拟机--线程安全与锁优化
- 2017.10.10 狼和羊的故事 思考记录
- shell 脚本字符串 分割或截取
- 【蓝桥杯嵌入式】【STM32】6_ADC之LCD实时显示电压值
- Tuxera NTFS对磁盘进行不同格式转换
- Python处理Excel数据-pandas篇
- Mari对称开启后另一半全粉了,变纯色了。
- 老电脑换Linux系统是否会更快,旧电脑不要装Windows!Bodhi Linux系统,小巧强悍,运行更流畅...
- 【Python】Pandas读取tsv文件
- android tv盒子哪个好用,2020什么电视盒子最好?超良心的三大实用选购技巧
- 【零基础】从零开始学神经网络《python神经网络编程》——手写数字识别实战
- java输出画一个爱心
- 分子模拟-学习笔记(二)
- h5 微信分享和踩坑指南
- Resolving Recurrence
- 程序员是如何一步一步被诈骗的?
热门文章
- chrome 插件开发中的热更新问题
- matlab风应力工具包,MSATSI:结合可靠经典方法的新简化用户处理及可视化工具的应力反演MATLAB软件包.pdf...
- 站大爷代理IP工具主要功能介绍
- IE新功能:十大特色IE插件(转)
- pptx文件怎么打开(ppt兼容包下载)
- 蓝宝石rx580怎么超频_【蓝宝石 RX580 8G D5 超白金 OC 显卡使用总结】游戏|界面|按钮|频率_摘要频道_什么值得买...
- xposed框架定位修改怎么用_硬核!教你三种方法,实现微信自定义修改地区!
- Vue2.0 Vue组件库
- scanf函数读取缓冲区数据的问题
- 第03章-二进制、八进制、十进制、十六进制之间的转换-深博-专题视频课程