专栏首页腾讯移动品质中心TMQ的专栏GT3.1简化您的App性能测试(2)——原理讲解,溯本求源

GT3.1简化您的App性能测试(2)——原理讲解,溯本求源

导读

GT3.1的版本更新,带来了全面的维度分析。那么这些功能是如何实现的呢?本章GT君将详细的从CUP维度、内存维度、流量维度、流畅度维度为大家讲解这些功能的作用和实现原理。

1 CPU

/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。 从proc文件中可以获取系统、进程、线程的CPU时间片使用情况,所以两次采集时间片的数据就可以获取进程CPU占用率, CPU占用率 = (进程T2-进程T1)/(系统T2-系统T1) 的时间片比值。

1.1 获取系统CPU时间片

获取系统CPU时间片使用情况:读取proc/stat,文件的内容如下:

文件第一行各个字段的含义:

总的CPU时间:totalCpuTime = user + nice + system + idle + iowait + irq + softirq

1.2 获取进程和线程的CPU时间片

获取进程CPU时间片使用情况:读取proc/pid/stat,获取线程CPU时间片使用情况:读取proc/pid/task/tid/stat,这两个文件的内容相同,如下:

标记中四位有对应字段的含义:

  • utime=41958:该任务在用户态运行的时间,单位为jiffies
  • stime=31:该任务在核心态运行的时间,单位为jiffies
  • cutime=0:累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
  • cstime=0:累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies

进程的总CPU时间:

processCpuTime = utime + stime + cutime + cstime

线程的总CPU时间:

threadCpuTime = utime + stime + cutime + cstime

1.3 CPU数据的统计与分析

基础性能维度CPU取值是采用的是相对值:

processCpuTime /totalCpuTime。

线程时间片维度CPU取值采用的是每秒的绝对值,即threadCpuTime。

我们统计的CPU使用,也已经将GT引入线程的损耗在总体的CPU使用中排除,因此结果可靠。

2 内存

2.1 系统内存

(1)系统内存总容量:只需要读取“/proc/meminfo”文件的第一个字段“MemTotal”就可以了,代表着系统所有可用的RAM大小,文件的内容如下:

(2)系统空闲的内存:只需要通过ActivityManager即可获取。

(3)系统已用内存:总内存与空闲内存做差。

2.2 进程内存

(1)进程内存上限:

(2)进程总内存:

3 流量

TrafficStats类是由Android提供的一个从你的手机开机开始,累计到现在使用的流量总量,或者统计某个或多个进程或应用所使用的流量,当然这个流量包括的Wifi和移动数据网Gprs。

获取进程流量的方法:

4 流畅度检测

4.1 流畅值(SM)定义

Android系统每隔16.7ms发出垂直同步信号(VSync信号)(1000ms/60=16.66ms),触发对UI进行渲染, 如果每次渲染都成功,这样就能够达到流畅的画面所需要的60帧/s,为了能够实现60帧/s,这意味着计算渲染的大多数操作都必须在16.7ms内完成。

所以当绘帧间隔超过16.7ms,垂直同步机制会让显示器硬件等待GPU完成栅格化渲染操作, 我们就可以说此时掉帧了,也就会造成用户直接感官的卡顿。

在这里,我们把1秒内vSync信号的次数,定义为流畅值,即SM。

对于卡顿的不同情况我们分为以下两类:

(1)低流畅值区间:连续小卡顿造成的丢帧,即平均流畅值低于40帧/s的区间;

(2)单次大卡顿:单次大卡顿造成的丢帧,既两次绘帧间隔大于70ms,相当于丢了4帧以上的区间。

4.2 SM计算原理

首先Android的帧绘制流程是:CPU主线程图像处理->GPU进行光栅化->显示帧。APP产生掉帧的情况大多是由“CPU主线程图像处理”这一步超负载引起的,所以我们思考如何去监控主线程绘制情况。要检测CPU绘制帧的时间,就必须找到那个调用View.dispatchDraw的类,Choreographer类就是那个接受系统垂直同步信号(VSync信号),在每次接受VSync信号时顺序执行View的Input、Animation、Draw等3个操作,然后等待下一个信号,再次顺序执行3个操作。如果第二个信号到来时,Draw操作没有按时完成,界面将不会更新,显示的还是第一帧的内容。这就表示丢帧了,丢帧是造成画面卡顿的原因。

所以我们可以向Choreographer类中加入自己的Callback,通过此Callback的doFrame函数我们可以统计一秒内帧绘制的次数,即流畅值SM,它能直观的代表当前时间段的流畅度。之所以不用FPS来代表当前流畅度,是因为Android系统默认在前台页面静止时,FPS可能为0,FPS低无法直接代表当前处于卡顿。

4.3 SM计算代码实现

利用Choreographer.FrameCallback计算流畅值相关代码:

上述代码中的pushData会记录doFrame的执行信息,这样就可以统计出1S内的执行次数,算出SM。

4.4 如何正确采集耗时代码的调用栈信息呢?

要获取主线程的调用栈信息,我们需要创建一个新的线程,在新的线程中使用uiThread.getStackTrace()来获取主线程的栈信息。这里主要说明,采集栈信息的时机。

实现逻辑,使用handler的postDelayed方法延时发送stackCollectRunnable采集栈信息,延时时间为interval(30ms,大于正常绘制1帧的时间,略小于正常绘制2帧的时间)。每一次帧绘制皆会回调doFrame函数,如果每次回调的时间间隔不超过interval,那么消息队列中的栈采集消息将被移除,如果超时,那么消息未被移除,将开始栈信息的采集。基于此,就可以正确定位造成丢帧的耗时代码了。

建立一个新的线程:

栈采集实现:

从代码可以注意到,每次采集完成,会发起下一条采集。如果下一次doFrame回调小于interval时间,stackCollectRunnable被移除,不再采集;如果下一次doFrame回调时间大宇interval时间,则stackCollectRunnable会执行采集操作;同时doFrame会在移除上一个stackCollectRunnable后新添一个stackCollectRunnable,保证如此循环,就能把所有丢帧时主线程的调用栈记录下来。

结语

下一篇《GT3.1 简化您的App性能测试(3)——原理讲解,溯本求源续》,GT君将继续为大家讲解页面启动时长维度、布局的构建与绘制维度、数据库操作维度的实现原理。

项目开源地址:

https://github.com/Tencent/GT

如果您有好的建议,可以留言给我们,谢谢!

版权所属,禁止转载!

本文分享自微信公众号 - 腾讯移动品质中心TMQ(gh_2052d3e8c27d)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android 8.0以后CPU使用率的方案研究

    由于Android 8.0以后Google的权限限制,SDK再也拿不到进程CPU的实时占用率,只能拿到自己本身进程的Jiffies,而由于拿不到系统整体Jif...

    腾讯移动品质中心TMQ
  • 后台性能测试不可不知的二三事

    某月黑风高之夜,某打车平台上线了一大波(G+)优惠活动,众人纷纷下单。于是乎,该打车平台使用的智能提示服务扛不住直接趴窝了(如下图)。事后,负责智能提示服务开发...

    腾讯移动品质中心TMQ
  • 腾讯TMQ在线沙龙回顾|Android App质量监控及工具应用实战

    腾讯移动品质中心TMQ
  • cpu(了解了以下8条,没人敢和你忽悠CPU)

    主频也叫时钟频率,单位是MHz,用来表示CPU的运算速度。CPU的主频=外频×倍频系数。很多人认为主频就决定着CPU的运行速度,这不仅是个片面的,而且对于服务...

    用户7657330
  • 了解一下CPU 第一篇(r4笔记第30天)

    CPU可能对于我们来说是熟悉又陌生的,每天的工作基本都离不开CPU,CPU的消耗是系统负载的一个重要指标,每天都会不定时的来看看CPU的使用情况,但是对于它了解...

    jeanron100
  • 计算机基础 | 多核、缓存...现代CPU是如何工作的

    之前的文章《源代码如何被计算机执行》已经提到,对于一段源代码,计算机主要依靠编译器将源代码转化为CPU可以执行的程序。那么,CPU到底是如何工作的呢?本文将介绍...

    PP鲁
  • 用 CPU 烤出来的肉,会特别香吗?

    众所周知,有一句话流传已久「显卡烧水,CPU 烤肉」。而最近有位网友(ytb:たれみみ親衛隊長)就认真实践了这一句,用 CPU 烤出来的肉是不是会特别好吃呢?

    HyperAI超神经
  • 物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket

    当我们试着通过 Linux 命令 nproc 和 lscpu 了解一台计算机 CPU 级的架构和性能时,我们总会发现无法正确地理解相应的结果,因为我们会被好几个...

    IT大咖说
  • 【版本更新】PerfDog新增帮助引导,规范化CPU利用率与性能参数命名

    距离上个版本更新仅半个月时间,PerfDog 3.5版本就又马不停蹄的来啦!开发小哥哥在疫情隔离期间的洪荒之力此刻全部爆发。新版本规范化CPU利用率与性能参数命...

    WeTest质量开放平台团队
  • Linux查询CPU信息

    Tyan

扫码关注云+社区

领取腾讯云代金券