一、监控数据及工具概述

相信移动测试方向工作的同仁,针对业界经常用到的性能监控工具和常见的性能监控数据,都不会陌生。这里也简单的聊一聊,接触过的主要监控工具有:网易的Emmagee,腾讯的GT,阿里的EasyTest,讯飞的iTest。

Emmagee相对而言比较简单,主要用于监控单个App的CPU、内存、流量,且仅适用于App的单进程,同时监控整机的CPU、剩余内存、电量、电流、温度、电压。因为Emmagee的功能比较简单,所以实现也简单些,后面原理也将主要根据Emmagee的代码来介绍。

GT侧重于随身调试,功能比较多,主要的监控数据包括单个App各进程的CPU、PSS内存、Private Dirty内存、jiffies,单个App整体的流量,此外,还可以监控到整机的CPU、内存、信号强度、FPS、电量。GT之所以称之为随身调,因为他除了监控功能之外,还包括查看日志、抓包、自定义输入参数的监控。

EasyTest定位于无线研发场景的客户端测试工具,包括的基础监控功能,监控数据包括单个App的CPU、内存、流量、电量,EasyTest的辅助测试能力是其主要功能,也是一大特色,比如:一键启动monkey、弱网模拟等。EasyTest除客户端外,还支持将监控数据实时上传到云端,可同步在web平台查看数据趋势。

iTest是讯飞出品的除Emmagee之外的国内另一款定位于监控的工具。iTest可以监控多个App或linux进程的CPU、PSS、流量、电量,针对多进程的App也同样适用,同时监控整机的CPU占用、剩余内存、CPU温度、FPS。此外,提供了CPU、内存、弱网等辅助测试场景的模拟。值得一提的是,iTest也提供了数据持久化,能够在web端查看数据走势图,且提供了版本间数据的对比。

针对以上几款工具,体验相关工具的最新版本后简单对比如下表1所示,大家也可以下载后体验,选取适合自己的工具。

总的来说,对于App,监控数据最常见的是CPU、PSS、流量;此外,为了分析问题,还需要有整机数据监控的能力,整机数据主要包括CPU、内存、电量,也有一些个别的做法:针对App的内存进行细分(nativie、dalvik),FPS数据获取。因本文主要介绍数据监控的内容,相关辅助能力及场景模拟能力不作详细介绍。

二、方法介绍

相关数据的获取无外乎几个来源,一种是Android从linux继承来的特性,与进程相关的信息会保存在文件中,监控工具做的事情就是去读取解析文件;一种是Android提供的API,监控工具直接调API再进行相应的处理既可;还有一种是从Android命令中获取需要的数据,监控工具先采用Runtime调用命令获取命令返回值进而解析处理得到需要的数据。下文分别针对常见的几种数据获取原理进行介绍。

1.    PID/UID概念及获取

上面提到的三种方法,前两个都需要有一个参数,有了这个参数,才能把数据文件和应用对应上,这个参数通常是PID或者UID。

说到PID,UID,这里简单介绍一下,与linux、windows一样,Android中PID标识的也是进程号,其实一个Android应用可以是单进程,也可以是多个进程,多进程时一个App则对应多个PID,且App退出(进程销毁)再打开后进程号通常会被系统重新分配。UID与PID不同,UID与Android应用是一一对应的,是应用的身份标识,UID是App安装后固定不变的,从这里可以看出,这个与linux、windows中的UID也存在一些不一样的地方。

PID的获取其实并没有非常直接的API(比如根据App包名查询到),通常是采用曲线的方式,Android中可以获取所有当前运行的App应用进程,通过遍历查询这些进程的包名信息是否与被监控的App包名信息一致,来得到App的当前运行进程,获取进程后即可通过查询该进程信息的属性得到PID,UID也可以通过相同方法获得。当然如果这个App当前并没有在运行,那么PID则获取不到。Emmagee相关代码在ProcessInfo类中,摘取关键代码如代码块1所示。可以看到其在API大于等于22后的是通过解析top命令结果获取PID的。当App不在运行的时候,UID的获取可以直接使用API获取得到,代码可参见代码块2。

有了PID和UID,可以开始讨论其他数据的获取原理了。


代码块1 PID获取方法


代码块2 UID获取方法

2.    进程CPU数据

进程CPU数据是根据PID通过读取系统生成的文件信息得到,文件路径为/proc/${PID}/stat。读取文件后,根据该文件参数定义挑选出该进程使用的CPU使用时间,Android中该文件如图1所示。图1以GT进程为例,当然为方便这里使用ps找到PID,另外在使用GT过程中,可以看到主要有几个值在变(方框里的22 12到中间的23 13到第三次的37 18),如果把这个文件以空格切分的话,那么方框里的4个数据是第14~17个。这四个值分别是utime,stime,cutime,cstime。分别代表进程在用户代码执行的累积时间、进程在内核代码执行的累积时间[i]、进程在用户代码等待线程执行的累积时间、进程在内核代码等待线程执行的累积时间[ii],单位为jiffies(通常是10ms)。不过通常情况下,cutime、cstime为0,这也就是为什么Emmagee代码CpuInfo类(代码块3)中并未计算这两个值的原因!这里要注意下,第14个对应数组元素的第13个。

说到这里,还只是介绍了进程的CPUTime值,这个值是累积值,既然是累积值,如果想得到CPU的瞬时值,则需要取到A时刻和B时刻的CPUTime值,相减即得到A时刻到B时刻该进程增加的CPUTime,最后只要除以A时刻到B时刻消耗的时间即得到该进程的CPU了。

图1 进程CPUTime示意图

代码块3 CPUTime获取

3.    整机CPU数据

A时刻到B时刻的时间通常是读取系统文件/proc/stat得到,第一行中cpu后面所有数值相加即得到系统开机后的累积时间,第4个代表系统开机后累积的空闲值,A时刻到B时刻消耗的时间则可以通过B时刻的开机累积时间减去A时刻的开机累积时间得到。利用空闲值则可以得到从A时刻到B时刻的整机CPU占用率。具体方法可参见Emmagee的CpuInfo类。


图2 整机总CPU统计文件图

4.    内存数据

内存只要获取当前值即可,并不像CPUTime存在累积的概念,相对而言比较简单,就是把PID作为参数使用API即可获取到。进程的内存数据获取如代码块4所示,这里摘自Emmagee代码MemoryInfo类,因为内存有很多数据,比如:PSS/VSS/RSS/USS,这里获取的是PSS内存(通常大家采用的是PSS,设置中应用占用内存也是PSS)。


代码块4 进程内存获取

系统总内存、剩余内存可以通过查看/proc/meminfo,如图3所示。剩余内存也可以通过API查询得到,可参见代码块5,同样摘自Emmagee代码MemoryInfo类。


代码块5 剩余内存获取


图3 整机内存文件

5.    流量数据

App的CPU/PSS获取都是先获取PID,再计算该进程的CPU/PSS。而流量则是根据UID来获取。代码块6也是引入Emmagee的TrafficInfo类,其中的TrafficStats.getUidRxBytes(uid)是在Android2.2引入的API。


代码块6 流量数据获取

6.    多进程App的数据获取

以上介绍了单进程CPU/PSS的获取,对于多进程,方法类似,区别仅仅在于多个PID的获取上,代码块2其实是通过与包名比较得到PID,同样的,对于某多个进程的App,如果进程名与该App的多进程名之一相同,则作为需要监控的进程,直至找到所有的PID为止,找到所有的PID,根据相同的方法就可以找到所有进程的CPU/PSS。这也就是多进程App的数据获取思路。

因为流量是通过UID获取,所以对于单进程、多进程的App,流量数据获取方法是完全一致的。

三、总结

上面的方法介绍其实是通用的一些方法介绍,很多监控工具和脚本都采用类似方法,相信大家看后对此监控原理会有大体的认识,我们的iTest也是基于类似的方法,只是在某些实现方面做了优化,后面再解读我们iTest的优化点和具体方法。


[i]http://www.linuxtopia.org/online_books/android/devguide/guide/developing/tools/ddms.html

[ii]http://stackoverflow.com/questions/16726779/how-do-i-get-the-total-cpu-usage-of-an-application-from-proc-pid-stat

关于我们:

公众号:itest_forever

CSDN:http://blog.csdn.net/itest_2016

QQ群:274166295(爱测未来2群)、610934609(爱测未来3群)

爱测未来移动-从Emmagee代码浅谈Android基础性能数据监控方法相关推荐

  1. 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台

    一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...

  2. 爱测未来安全-浅淡流量劫持及应对措施

    在前几天公司里的某个项目组产品遇到了一件怪事,且听我重现下过程和场景(来自用户反馈的还原). A用户:这产品真不错,同事刚刚推荐的,那我得赶紧用用...启动中...嗯?怎么插入了这么一个大广告,不会吧 ...

  3. 爱测未来开发-Zabbix的使用 API的调用

    一.zabbix的简单介绍 1.什么是zabbix zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. 2.选用zabbix的原因 开源方案:提供win32和 ...

  4. 想说爱你不容易,浏览器缓存浅谈

    今天小微开店宝在测试环境发布更新的时候,同事问:"为什么我需要手动清理浏览器缓存才能看到变更?难道系统上线后也需要客户自己清理浏览器缓存吗!"看来,这个坑需要我来填了. 什么是浏览 ...

  5. 浅谈Android保护技术__代码混淆

    浅谈Android保护技术__代码混淆 浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读 ...

  6. 浅谈Android SDK开发

    目录 浅谈Android SDK开发 SDK开发的原则 SDK设计 功能与职责边界设计 接口设计 兼容性设计 发布输出设计 SDK文档设计 SDK项目架构 组件化.模块化 统一资源管理 第三方依赖管理 ...

  7. 【JY】浅谈混凝土结构/构件性能试验指标概念(二)

    因你精彩 即刻关注 ☞ [写在文前] 上期[JY]浅谈混凝土结构/构件性能试验指标概念(一)中从"定量"的角度对混凝土结构/构件的试验指标进行探讨,本期主要从"定性&qu ...

  8. 浅谈Android中的MVP与动态代理的结合

    浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...

  9. 浅谈List保存的数据是引用数据类型的地址

    浅谈List保存的数据是引用数据类型的地址 今天一个初学javaweb的朋友问我一个bug,经过和别人 讨论分析了解到List对象细节上的一些问题,我将代码重新简化构造了一下做成了一个例子.上代码: ...

最新文章

  1. 就想写个爬虫,我到底要学多少东西啊?
  2. 机器学习理论篇:机器学习的数学基础
  3. 宝马3系m套件清单图_穿上套件我就不认识你了?华晨宝马1系新老对比
  4. 视觉设计_视觉设计:
  5. 今天是个特殊的日子,养活我的Java爸爸诞生,发送一波福利!
  6. python源码中的学习笔记_第5章_字典
  7. ES中使用nested类型的内嵌对象
  8. 表单从gb2312的页面提交到utf-8页面,或者表单从utf-8的页面提交到gb2312页面的解决办法...
  9. 新建模块 pom.xml依赖无法识别_使用模块依赖关系,第2部分
  10. 最常用英语单词2000个
  11. chrome最简单的多开方法
  12. 用计算机演奏森林时光,森林时光-xpaper全媒体电子报刊系统
  13. VMware VSphere Client克隆虚拟机
  14. Python中的图形绘制——3D绘图
  15. lineage+os+15+android,小米5 原生 Android 8.1“奥利奥”——lineageOS 15.1安装教程
  16. mysql错误编号2058_SQLyog连接MySQL时出现的2058错误解决方法
  17. 从京东产品学搭建SaaS架构
  18. spring boot共享电动单车管理系统毕业设计源码131016
  19. AtCoder - agc005_b(单调栈)
  20. VirtualBox Guest Additions

热门文章

  1. 日语口语1.11  松田社長がおいでになることを伺っておりまして、ずっと待っておりました
  2. 解决帆软中不能制作城市热力图的问题
  3. MetLife - 美国大都会人寿保险公司
  4. LiveData详细分析
  5. 我的app JustDoIt 番茄时钟
  6. C语言100个囚犯和灯泡,一百个囚犯和一个灯泡
  7. 锐捷NBR路由器命令执行漏洞复现
  8. flink sql 知其所以然(八):flink sql tumble window 的奇妙解析之路
  9. 安卓开发制作微信界面
  10. 京东商品爬虫实战笔记