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管道,通常包含以下阶段:

  1. SurfaceFlinger中的EventThread唤醒了应用程序UI线程,表明现在是渲染新帧的时候了。
  2. 应用程序使用CPU和GPU资源在UI线程,RenderThread和hwuiTasks中渲染帧。这部分暂UI的大部分。
  3. 应用程序通过binder将绘制好的帧发送到SurfaceFlinger并进入睡眠状态。
  4. SurfaceFlinger中的第二个EventThread唤醒SurfaceFlinger来触发组合和显示输出。如果SurfaceFlinger确定没有任何工作要完成,它将返回睡眠状态。
  5. SurfaceFlinger通过HWC / HWC2或GL处理组合。 HWC / HWC2组合更快,更低的功耗,但会受到SOC的限制。这一步通常需要4-6ms,但是可以与步骤2重叠,因为Android应用程序总是三重缓冲。 (虽然应用程序总是三重缓冲,但在SurfaceFlinger中只能有一个待处理帧,因此和双重缓存差不多。)
  6. 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管道,通常包含以下阶段:

  1. SurfaceFlinger中的EventThread唤醒了应用程序UI线程,表明现在是渲染新帧的时候了。
  2. 应用程序使用CPU和GPU资源在UI线程,RenderThread和hwuiTasks中渲染帧。这部分暂UI的大部分。
  3. 应用程序通过binder将绘制好的帧发送到SurfaceFlinger并进入睡眠状态。
  4. SurfaceFlinger中的第二个EventThread唤醒SurfaceFlinger来触发组合和显示输出。如果SurfaceFlinger确定没有任何工作要完成,它将返回睡眠状态。
  5. SurfaceFlinger通过HWC / HWC2或GL处理组合。 HWC / HWC2组合更快,更低的功耗,但会受到SOC的限制。这一步通常需要4-6ms,但是可以与步骤2重叠,因为Android应用程序总是三重缓冲。 (虽然应用程序总是三重缓冲,但在SurfaceFlinger中只能有一个待处理帧,因此和双重缓存差不多。)
  6. 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的工作原理相关推荐

  1. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  2. 深入理解Nginx工作原理

    1 反向代理 1.1 概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给intern ...

  3. 高频开关电源原理_程控开关电源的工作原理

    本文介绍了开关电源的工作原理以及它的特点. 程控开关电源要要比线性电源复杂得多. 下图是典型的开关电源工作原理图. 首先对 220 V/50Hz 的 AC 输入,通过桥式整流器进行整流 储能电容对整流 ...

  4. Servlet生命周期与工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  5. java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...

  6. linux网络管理原理,Linux__网络管理(物理层 数据链路层 网络层工作原理)

    千锋云计算逆战班11点后打卡 今天学习后,进行复习下,物理层 数据链路层  网络层 的工作原理 物理层关心的两件事情:1.信号 2.介质 先说信号:信号分为模拟信号和数字信号 模拟信号: 模拟信号,不 ...

  7. HDD工作原理 导图

    以上导图介绍了我们使用的 (HDD)机械硬盘的基本构造以及核心工作原理,对于大家扫盲有所帮助 参考文档: https://blog.csdn.net/yizhaoxin/article/details ...

  8. 路由和交换机工作原理

    路由器与交换机的工作原理 计算机网络往往由许多种不同类型的网络互连连接而成.如果几个计算机网络只是在物理上连接在一起,它们之间并不能进行通信,那么这种"互连"并没有什么实际意义.因 ...

  9. Google工作原理

    今天在晚上看到一个图,讲解google的工作原理,感觉写的不错.贴过来方便以后深入的研究. 转载于:https://www.cnblogs.com/muyuge/archive/2010/07/06/ ...

  10. 【摄像头】摄像机工作原理

    1.摄像机工作原理 外部光线穿过镜头(lens)后, 经过滤光片(color filter)滤波后照射到光学传感器(Sensor)上面, Sensor 将从 lens 上传导过来的光线转换为电信号,再 ...

最新文章

  1. 站在这山看着那山高,到了那山没柴烧.
  2. ue4是什么意思_恋爱中,男生最喜欢什么相处模式?
  3. 健康管理-健康管理特点
  4. 代码分析工具python_Python代码分析工具:PyChecker、Pylint
  5. 深入理解java虚拟机--线程安全与锁优化
  6. 2017.10.10 狼和羊的故事 思考记录
  7. shell 脚本字符串 分割或截取
  8. 【蓝桥杯嵌入式】【STM32】6_ADC之LCD实时显示电压值
  9. Tuxera NTFS对磁盘进行不同格式转换
  10. Python处理Excel数据-pandas篇
  11. Mari对称开启后另一半全粉了,变纯色了。
  12. 老电脑换Linux系统是否会更快,旧电脑不要装Windows!Bodhi Linux系统,小巧强悍,运行更流畅...
  13. 【Python】Pandas读取tsv文件
  14. android tv盒子哪个好用,2020什么电视盒子最好?超良心的三大实用选购技巧
  15. 【零基础】从零开始学神经网络《python神经网络编程》——手写数字识别实战
  16. java输出画一个爱心
  17. 分子模拟-学习笔记(二)
  18. h5 微信分享和踩坑指南
  19. Resolving Recurrence
  20. 程序员是如何一步一步被诈骗的?

热门文章

  1. chrome 插件开发中的热更新问题
  2. matlab风应力工具包,MSATSI:结合可靠经典方法的新简化用户处理及可视化工具的应力反演MATLAB软件包.pdf...
  3. 站大爷代理IP工具主要功能介绍
  4. IE新功能:十大特色IE插件(转)
  5. pptx文件怎么打开(ppt兼容包下载)
  6. 蓝宝石rx580怎么超频_【蓝宝石 RX580 8G D5 超白金 OC 显卡使用总结】游戏|界面|按钮|频率_摘要频道_什么值得买...
  7. xposed框架定位修改怎么用_硬核!教你三种方法,实现微信自定义修改地区!
  8. Vue2.0 Vue组件库
  9. scanf函数读取缓冲区数据的问题
  10. 第03章-二进制、八进制、十进制、十六进制之间的转换-深博-专题视频课程