移动性能测试 [个人总结分享] 安卓端性能测试 (数据篇)

浮云 · May 28, 2018 · Last by 浮云 replied at June 27, 2018 · 4118 hits

开篇前述:

续《安卓端性能测试 (思路及方案设计篇)》列下主要数据来源,毕竟性能还是要和数据打交道,了解数据来源和探索利用数据的形式很重要,总结下一些常用数据来源。
数据源的文本截取就是编程语言基础能力了。我常用shell+busybox设计安卓端监控脚本,通过busybox的sed,grep,awk解决,两个主要思想:
1、文本流处理,同时截取处理,复杂逻辑设计awk解决
2、能文本流一次性保存就不要分多步,影响处理性能
还有一点主导我设计的思想是在监控结果呈现上:通过数据统计引导数据关注点,通过排序引导关键数据呈现。(比如在内存数据呈现上,除了峰值排序,还会关注极值差排序)

正篇开叙

时间数据来源

1、秒级精度
(1)date命令获取的时间

2、分秒精度
(2)/proc/uptime

3、毫秒精度
(1)Log时间戳
(2)uiautomator events 信息的EventTime

4、微秒精度
(1)系统环境变量:$EPOCHREALTIME
(2)getevent -t -l 的时间戳

5、纳秒精度
(1)/proc/timer_list(linx内核定时器节点)第三行now at
(2)使用timer接口输出的时间,如vsync时间

流畅度量化(原创计算需求)

1、帧数据
(1)dumpsys SurfaceFlinger --latency
(2)dumpsys gfxinfo 包名 framestats (安卓5.0及以上版本)

2、FPS
(1)帧数据采样间隔1.6S左右(60帧屏127帧=2.116S,为了连续抓数据和平衡抓取开销)
(2)统计样本帧数/样本时间;只有一帧按硬件绘制耗时的结束时间计算
(3)Vsync间隔大于500ms算静置,不计算帧率且不输出
(4)空数据、vsync=最大正整数数据不处理
(5)Vsync帧数据复用,结束时间加首行绘制间隔(注:最早发现这个现象是微信红包弹出效果的数据,有复用帧)

3、硬件掉帧比例( jank% )
(1)帧数据中第三列和第一列的差值,如果大于首行绘制间隔jank帧数+1
(2)Jank总帧数/样本数据总帧数
(3)引导优化方向为framework优化SurfaceFlinger绘制性能,如已优化过则主推精简ui布局及图片资源大小

4、帧间隔超过kpi的帧数比例
(1)按人眼识别卡顿100ms,可定制
(2)引导优化肉眼可识别的严重卡顿,降低此比例

5、按人眼视觉的当前认知标准判定:
(1)严重卡顿:帧间隔≥100ms(按人眼视觉存在100ms的反应时间)
(2)轻微卡顿:50ms≤帧间隔<100ms(游戏帧率可玩底线20帧)
(3)延迟:42ms<帧间隔<50ms(视频级体验按网络流24帧)

6、流畅度打分评价
(1)比例分配:平均帧率/60*60%+kpi/最大两帧间隔*20%+帧间隔小于kpi帧数比例*20% (除法比例最大为1,kpi可定制,按人眼识别卡顿是100ms)

资源负载

1、CPU:
(1)top –n 1 命令:按单核100%计算cpu占用。
缺陷:相对busybox top –b –n 1执行耗时长、计算精度低,无执行参数、无分配所在核的编号、不同设备预置的版本不同不利于脚本通用性。
(2)dumpsys cpuinfo:获取cpuinfo服务计算的系统和进程cpu占用快照。
缺陷:累计时段比top长、受dumpsys meminfo影响会拉高cpu占用数值
(3)按节拍数( jiffies )设计代码逻辑计算:/proc/进程pid/stat
缺陷:逐个进程计算的效率并不比top命令高,更适用已知单进程监控

2、内存:
(1)总内存kernel节点:/proc/meminfo
(2)dumpsys meminfo:获取内存占用快照,包括总内存和进程内存pss排序,加包名/PID获取进程内存占用细节,会主动触发GC后获取。
(3)procrank:eng/userdebug版本可用,计算进程内存到uss占用
(4)ps/busybox ps :包含VSS和RSS

3、IO:
(1)kernel节点:/proc/进程pid/io (需kernel支持,root下获取)

4、流量:
(1)/proc/uid_stat// (第一个是UID,第二个是tcp_rcv和tcp_snd)
(2)/proc/net/xt_qtaguid/stats

频率评估(原创统计形式并开发了监控脚本)

1、Log打印控制的数据需求:
(1)样本:5秒的log(logcat –v thread time)
(2)样本的统计项:总行数/总时间、每个tag的打印总行数/总时间
(3)额外信息:tag的pid对应的进程

资源分配上限

1、内存泄露:
(1)受控情况下的最大堆内存大小:getprop dalvik.vm.heapgrowthlimit
(2)不受控情况下的最大堆内存大小: getprop dalvik.vm.heapsize
(3)LowMemoryKiller值: /sys/module/lowmemorykiller/parameters/adj与/sys/module/lowmemorykiller/parameters/minfree
(4)进程VSS虚拟地址耗尽:32位=4G、64位=128G (BSP会占用1G,其他是VSS可用)

2、Linx系统限制::
(1)ulimit -a 查看所有限制
(2)文件描述符(/proc/进程pid/fd) :ls –l查看,统计行数,上限=1024(kernel可调整)

状态信息

1、UI状态:
(1)Window: dumpsys window visible
(2)Activity: dumpsys activity top
(3)uiautomator: uiautomator dump xml文件保存完整

能源状态:

1、显示: dumpsys display
2、电量:dumpsys power
3、能源状态系统节点:主频、温度传感器数据、屏幕亮度等,在不同芯片厂商定义不同

外部硬件采集

1、响应时间/帧率:
(1)摄像头采集+机械臂操作
(2)视频采集卡+遥控设备

2、能源:
(1)功耗:功耗计(TV)、Power Monitor及同类产品(手机)
(2)温度:热电偶、红外热成像摄像头

3、硬件模块按需DIY
(1)淘宝来源如:支持蓝牙模块的usb电压电流表、医用温度测试模块、亮度采集模块等等

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞

请教大神在监控时如何评估FPS的,目前用自动化驱动场景去做监控,但是FPS数据毛刺严重,每次FPS的测试结果相差较大

浮云 #3 · June 27, 2018 作者
leon 回复

我自己写的fps计算方法和打分规则,用户体验角度讲,实践后明显10分一档,每10分跨度都会有体验差异。还有两个维度数据的定向性能问题highlight:1、硬件掉帧;2、一组采样数据中100ms≤帧间隔≤500ms的比例
分别对应推进对应的体验优化,如果是游戏体验,会调整统计 50ms≤帧间隔≤500ms的比例

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up