移动性能测试这事儿,我做了快十年,从3G时代一路测到现在的5G。说实话,5G带来的性能测试挑战,比当年3G换4G要猛得多。表面上看,5G只是网速变快了,但真正上手测过之后你会发现,高带宽、低时延、海量连接这几个特性,几乎把移动应用的性能瓶颈全部重新定义了一遍。帧率、功耗、弱网、网络切换、启动速度、流量消耗,每一个维度都有了新的说法,旧的测试思路和方法,放在5G场景下真的不太够用了。
这篇文章我就按自己实际做项目的经验,把5G时代的移动性能测试思路、工具选型、专项测试方法、问题定位和优化落地整个串一遍。适合正在做移动端性能测试的同学参考,也适合开发同学了解“为什么性能测试会提出这些奇奇怪怪的需求”。
1. 5G时代的性能测试,变化的到底是什么
1.1 从“网速”到“体验”:带宽红利带来了什么问题
大多数人听到5G,第一反应是“下载速度快”。速度确实是5G最直观的提升,但对性能测试来说,真正要关注的不是速度本身,而是速度背后的连锁反应。
5G典型场景下,单用户下行速率能达到千兆级别,上行也能到百兆以上。带宽上来了,产品经理和老板的第一反应就是“那我们是不是可以把内容做得更重、更清晰、更实时了”?于是高清视频从1080P变成4K,视频流从短切片变成低时延直播,App里的图片素材越来越大,云端渲染、实时协同这类功能开始往移动端堆。这些功能在5G网络下确实能跑起来,但代价是功耗、发热、内存占用、渲染压力全线拉高。
我在某项目里测过一款高清视频类App,在4G网络下一切正常,切到5G网络后,用户反馈手机发烫、掉电特别快。一测才发现,App在检测到高带宽网络后,直接把视频码率拉到最高档,同时预加载窗口翻了好几倍,GPU解码压力猛增,CPU频繁被唤醒,整机功耗直接飙到接近玩游戏的水平。这类问题在4G时代根本不会出现,因为带宽不允许产品端这么激进。
这就是5G时代性能测试的第一个变化:性能问题的触发条件变了。以前很多问题是“网络差导致的”,现在反而是“网络太好了导致的”。测试人员不能只盯着弱网场景,5G强力网络下的“过度响应”同样是大问题。
1.2 5G性能测试的维度扩展
传统的移动性能测试,核心维度基本是帧率、内存、CPU、启动时间、流量这几个。到了5G时代,我实际项目中归纳下来,至少要多出六个新的关键维度。
功耗和发热是排在第一位的。5G网络本身功耗就比4G大,加上应用层的高负载,发热问题非常突出。用户不会看你的CPU占用率,他们只感知到“手机烫”和“电不经用”。这两个指标直接跟卸载率挂钩。
网络切换稳定性排第二。5G的覆盖还没有像4G那么完善,用户会频繁在5G、4G、Wi-Fi之间切换。每次切换,连接断开、重连、鉴权、数据缓冲,任何一个环节处理不好,用户感知就是“卡一下”或“转圈圈”。在4G时代,这种切换频率低,问题不容易暴露,5G时代这个问题变成了高频场景。
弱网测试的范围也在扩大。以前弱网测试主要关注带宽限制和丢包,现在还要关注RTT抖动、上下行速率不对称、基站拥塞等更复杂的网络状态。5G高频毫米波的穿透力差,室内信号衰减比4G严重得多,测试时要模拟的场景更多样。
高帧率和高清渲染也是新维度。现在很多手机支持90帧、120帧,App如果做成高帧率,渲染负载直接翻倍,测试时要看GPU渲染时间、掉帧分布、帧间隔波动。4K视频、云端渲染这些重负载场景,对渲染管线、解码能力、内存带宽的要求都更高。
启动时延和首包时间的标准也变了。5G低时延特性让用户对“快”的预期提高了,以前启动3秒觉得还行,现在2秒都嫌慢。同时,首包时间不再只看网络,还要看App拿到网络数据后到第一帧渲染出来的时间。
最后是流量消耗。5G套餐流量虽然变多了,但用户对流量的敏感度并没有消失。App如果对高带宽“上瘾”,无节制地预加载、后台同步,流量消耗会成为负面口碑。
1.3 建立5G性能考核模型
维度变多了,测试团队不能再用一把尺子量所有场景。我在实际项目中,会把性能考核模型拆成三层。
底层是基础性能,包括CPU、内存、帧率、启动时间这些老指标,任何网络环境下都要达标。中间层是5G专项指标,包括功耗、温升、网络切换时延、弱网体验、流量消耗。顶层是综合体验层,把底层和中间层的指标按业务场景加权,模拟真实用户在不同网络环境下的整体体验。
以某视频类App为例,基础性能要求主线程CPU占用率不超过某阈值,帧率稳定在60FPS不出现连续掉帧;5G专项指标要求播放4K视频30分钟温升不超过某个范围,5G切4G时播放中断时间小于某阈值,连续观看一小时流量消耗在合理区间;综合体验层再做人因评分,比如观看过程中出现可感知卡顿的次数。
这种分层考核模型的好处是,出了问题能够快速定位责任面。用户抱怨发烫,不用先从代码层面找,先看是不是5G专项指标里的温升超标了;用户抱怨卡顿,先看是网络切换导致的还是渲染层掉帧导致的。分层之后,测试报告的价值会提高很多,不再只是一堆数据的堆砌。
2. 测试环境与工具链搭建
2.1 手机与网络环境怎么选
5G性能测试最大的坑,就是测试环境不稳定。5G网络受基站负载、信号强度、干扰、频段的影响非常大,同一个测试用例,上午跑和下午跑,数据可能差出一大截。
所以第一步,测试手机的选择要覆盖5G的关键特性。至少要准备支持不同运营商频段的机器,尽量选择主流5G频段覆盖比较好的机型。同时要准备一台4G手机做对照,很多性能问题需要通过4G/5G同场景对比才能定位。比如功耗高了,是5G射频本身导致的,还是应用层负载导致的,对照测试一看便知。
网络环境的搭建,我建议分两级。第一级是实验室环境,用5G信号模拟设备来搭建可控网络。这种方案可以灵活调节带宽、时延、丢包率、信号强度,还能模拟5G和4G的切换。缺点是设备成本高,不是每个团队都有条件搭。第二级是真实网络环境,选固定的室外场景和室内场景分别测试。真实网络的优点是贴近用户实际体验,缺点是网络波动大,要做多次重复测试取均值才可信。
实际操作中,我常用的组合是“实验室模拟网络做归因分析,真实网络做验收测试”。实验室里发现规律、定位问题,真机上验证用户实际体验。如果团队没有实验室条件,那就只能在真实网络下多跑几轮了,同一场景至少重复三次,取中位数或者平均值,避免被单次网络波动带偏。
2.2 常用测试工具的分工
5G性能测试工具链,我按功能分四类。
第一类是数据采集工具,用来抓CPU、内存、帧率、网络IO、电量等基础数据。这类工具大体分两种,一种是基于系统Profiler的,优点是兼容性好;另一种是商业化的性能采集工具,精度更高,对游戏和视频类App的帧率采集能力更强。我一般测试过程中两套同时开,用系统工具做兜底,用商业化工具做精细化数据。
第二类是网络模拟工具,用来模拟弱网、高时延、丢包、网络切换等场景。这类工具能在应用层和网络层两个层面做干扰,应用层工具只能限制传输速率,网络层工具可以精确控制丢包率、RTT、抖动等参数。做5G专项测试时,必须要用网络层的模拟工具,尤其是测网络切换时延的时候。
第三类是功耗测试工具。手机端主要靠电池电流计,精度高的电流计能测到毫安级变化。如果是做整机级功耗分析,还需要配合温箱来保证测试环境温度恒定,否则温度一变,主板功耗曲线会跟着变,数据就不准了。
第四类是抓包工具。做网络层问题时,比如首包时间慢、切换失败、数据请求异常,一定要抓包看协议交互过程。5G时代需要重点关注TCP、QUIC、HTTP/2这些协议的交互细节。
工具不在多,关键是每个项目把固定的一套组合用熟。频繁换工具,数据口径不一致,可比性就很差。
2.3 数据采集口径统一
这一节想说一个很多人忽略的问题,就是数据采集口径的“统一”。没做过性能测试的人可能觉得,拿着工具采数据,然后看结果不就行了?实际上,不同工具、不同采集方式、不同统计口径,出来的数据根本对不上。
举个典型的例子,帧率的统计。有的工具统计的是渲染帧率,有的是显示帧率,还有的是应用层主动上报的帧率。同一台手机跑同一个场景,三个工具能给出三个完全不同的数字。经验是,FPS有两种统计方式:第一种是“平均帧率”,就是测试时间内总帧数除以总时间;第二种是“帧间隔”,记录的是每两帧之间的时间差,这个数据更能反映卡顿。如果只是看平均帧率,一个掉帧很多但均值还不错的场景,很容易被漏过去。
再比如CPU占用率的统计,有的工具采的是整机CPU,有的是进程CPU,有的是线程CPU。手机是八核处理器,大核小核切换频繁,不同统计维度差异非常大。统一口径之后,团队内部横向对比才有意义。
我在团队里推行过一个做法:写一份数据采集规范文档,规定每一个指标用什么工具、什么采集频率、什么统计口径、测试时长是多少、测试前手机处于什么状态。这样无论是测试新人还是老手,出来的数据都是可比的。这个文档花不了多少时间,但能省掉后面大量的扯皮时间。
3. 5G场景下的专项性能测试实操
3.1 功耗测试:电量曲线与温度数据怎么解读
功耗测试是5G性能测试里最典型的专项。很多人一上来就测整机功耗,看个线性图就结束了。这个粒度太粗,对定位问题帮助很有限。
我的做法是分三步走。第一步先测整机功耗基线,记录测试场景下手机从满电到某低电量的完整曲线,同时记录温度变化。这一步回答的问题是“整体功耗是否在可接受范围内”。第二步做模块级拆分,通过工具把电量消耗按屏幕、CPU、GPU、网络射频、传感器等维度拆分出来,这一步能看出功耗主要是哪个模块在消耗。第三步是针对可疑模块做精细化验证,比如怀疑是网络模块导致的,就对比飞行模式和5G模式下的功耗差异;怀疑是渲染导致的,就把分辨率调低一档测功耗变化。
温度数据要跟功耗曲线放在一起看。电池的放电特性受温度影响非常大,温度升高时内阻降低,电流会变大,功耗会进一步升高,形成正反馈。所以测试环境温度必须恒定,我一般在恒温环境下测,测试过程中手机不充电,尽量不碰屏幕,避免测试员手动操作引入额外功耗干扰。
这里有一个非常关键的经验:功耗测试结果很容易被后台进程干扰。测之前一定要清理后台,关掉不必要的推送、定位、自动同步功能。而且5G网络下后台同步的触发会很频繁,如果不关掉,测出来的是“整机后台乱跑”的功耗,而不是被测应用的功耗。有一个比较有效的做法是,测完第一轮之后,再用飞行模式+关闭应用的方式测一次基线功耗,两个数据相减,得到的就是应用自身的功耗增量。
3.2 弱网与网络切换测试
5G弱网测试不能只模拟“带宽小”,还要模拟“信号波动”。真实5G场景里,弱网更多表现为信号强度在强弱之间跳变,速度忽快忽慢,时延忽高忽低。
实测方法上,我会设计几类固定场景。第一类是持续弱网,带宽限制在1Mbps到2Mbps之间,丢包率控制在1%到3%,用来测试应用在持续受限网络下的行为。第二类是抖动场景,时延在50ms到300ms之间随机抖动,带宽间歇性受限,模仿用户在地铁、商场里移动时的网络体验。第三类是切换场景,5G切4G、4G切5G、5G切Wi-Fi、Wi-Fi切5G,每种切换都要记录从切换开始到应用恢复正常体验的时间。
网络切换测试的关键指标是“业务中断时延”。拿视频播放来说,从网络切换发生到视频画面恢复播放,这段时间就是用户感知到的卡顿时长。正常情况下这个时间应该越短越好,如果切换导致应用要重连服务器、重新拉流、重新缓冲,中断时延会非常难看。
我踩过的坑是,很多应用的网络库在连接断开后,默认走超时重连机制,超时时间设置得比较保守,比如10秒、15秒。在4G环境下网络切换次数少,用户体验影响不明显。5G环境下切换频繁,每次切换都等超时再重连,用户会崩溃。这类问题性能测试是能提前发现的,只要在实验室里模拟切换场景,观察连接从断开到恢复的时间即可。
3.3 高清渲染与流畅度测试
5G时代的高清渲染测试,主要针对两类场景。一类是高帧率游戏,另一类是高清视频播放和云端渲染应用。
游戏场景的流畅度测试,传统做法是看平均帧率,但我更建议把“帧间隔”和“掉帧分布”作为主要参考。帧间隔能反映帧生成的稳定性,掉帧分布能看出卡顿是集中在某些特定时间点还是随机出现。实测时,我会故意制造一些操作,比如快速转向、多人团战、场景切换,这些操作最容易暴露渲染瓶颈。
高清视频场景的测试重点是“首帧渲染时间”和“长时播放稳定性”。首帧渲染时间指应用拿到第一块视频数据后,到屏幕上出现第一帧画面的时间。很多应用在弱网下首帧时间会大幅上升,因为要等关键数据全部到位才开始解码。长时播放稳定性主要是看播放30分钟、1小时之后,会不会出现显存泄漏、解码器崩溃、音画不同步的问题。
做高清渲染测试时,GPU厂商的调试工具是很好的辅助。它能输出每一帧在GPU上的绘制时间、顶点数、填充率等底层数据,能直观看出渲染瓶颈是在CPU提交阶段还是在GPU执行阶段。这个对定位“CPU喂不饱GPU”还是“GPU本身能力不够”非常有效。
3.4 启动时延与首包时间
启动时延是移动性能测试里的老指标,5G时代它的重要性进一步提升。用户对启动的耐心越来越短,而且5G低时延网络让“网络等待耗时”缩短了,应用层自身的初始化、渲染、数据解析耗时占比就凸显出来。
测试启动时延,要注意区分“冷启动”和“热启动”。冷启动是进程不存在的情况下,从点击图标到首页完全可交互的时间;热启动是进程在后台被杀后重新启动的时间。两者的优化重点不一样,冷启动更关注初始化方法耗时和首帧渲染耗时,热启动更关注状态恢复和数据缓存命中。
首包时间比启动时延更偏向网络侧。从用户点击到应用发出请求、服务器返回第一个数据包,这个时间受网络质量影响很大。在5G网络下做首包时间测试,我习惯把“本地网络优化”和“服务端响应”两部分拆开:抓包看DNS解析时间、TCP建连时间、TLS握手时间、HTTP请求发送到收到响应的时间。4G和5G的差异主要在网络传输层,如果5G下首包时间反而比4G慢,多半是应用层或者服务端的问题,跟网络无关。
4. 性能问题定位与优化落地
4.1 把“卡顿”落到具体模块
测试的意义在于定位问题,不只是发现问题。5G性能问题表现出很强的“复合性”,比如用户反馈“看视频卡顿”,可能原因包括:网络切换导致的连接重置、GPU解码能力不足导致的掉帧、播放缓冲策略激进导致的CPU飙升、后台任务抢占主线程导致渲染不及时。如果只测到“卡顿”这个现象就收工,开发拿到报告也没法动手。
我通常的定位方式是“三层剥离法”。第一层剥离网络因素,在Wi-Fi环境下复测,如果不再卡顿,说明和网络相关,进一步抓包定位;第二层剥离渲染因素,把画质调低一档复测,如果不再卡顿,说明是渲染负载的问题,再看GPU耗时曲线;第三层剥离后台因素,在纯净环境下复测,如果不卡了,那大概率是后台任务抢资源,接着看主线程的耗时分布。
4.2 5G场景下最常见的三类问题
第一类是“网络适应性问题”。这类问题表现为高带宽网络下无节制使用资源、弱网下恢复不及时、网络切换时无重试机制或重试间隔过长。根因多数在应用层的网络策略上,解决办法是建立“网络感知”能力,根据当前网络状态动态调整资源加载策略。
第二类是“功耗快速上升问题”。根因通常是射频模块长时间保持高活跃、复杂网络请求频繁唤醒CPU、后台任务在5G网络下被放大了频率。这三类细说起来,射频问题要从传输策略上解决,比如合并请求、降低心跳频率;CPU唤醒问题要从任务调度上解决,比如对齐后台任务、使用系统提供的批量传输接口。
第三类是“渲染链路超载问题”。根因是应用在5G下加载的数据量变大、分辨率变高,但渲染管线没有同步优化。这类问题常用解法是变长渲染、纹理压缩、按需加载,核心思路就是“先显示能看的,再慢慢显示更精细的”,不要让用户等待完整的重资源加载完成才出画面。
4.3 优化方案的推进思路
性能问题定位清楚之后,推进优化方案也有讲究。如果一上来就ALL IN把所有问题一起优化,大概率改到一半发现改了A影响B,最后得不偿失。我习惯把优化项按“性价比”排序,优先处理对用户体验影响最大、改动成本最小的项。
判断性价比有几个维度:用户可感知程度、5G场景下的发生频率、改动涉及的范围、回归成本。以某视频应用为例,“切换网络时视频恢复时间过长”这个问题,用户明确感知到、发生频率高、修复方案集中在网络库策略配置上、回归测试范围可控,就是典型的高性价比项。“4K视频播放时整机功耗偏高”这个问题,感知程度高、发生频率高,但修复可能涉及解码方案更换、渲染管线改造,改动范围大、回归成本高,就要单独排期做专项。
另外一个经验是,优化方案配合“A/B对比数据”来推进效果更好。同一场景下,优化前和优化后各采一轮数据,把功耗曲线、掉帧分布、中断时延等关键指标放在同坐标系里对比。领导看得懂、开发也服气,后续排期审批会顺利很多。
5. 常见问题与避坑经验
5.1 实测中踩过的坑
性能测试的坑,很多是重复踩的。第一个坑是测试机发热导致数据失真。手机发热后,系统会主动降频,帧率和CPU性能都会下降,测出来的数据比真实水平低。解决办法是测试前让手机自然冷却到室温,连续测试时每轮之间留冷却时间,有条件的话用散热背夹。
第二个坑是后台进程干扰功耗数据。手机里的很多系统服务会在后台周期性工作,比如同步、备份、云盘上传。这些活动一多,功耗基线就飘掉了。我在测试前会进开发者选项,开启“不保留后台活动”,并且关掉所有能关的后台同步,还是拿不到稳定基线的话,就改用另一台专门用于测试的备用机。
第三个坑是网络模拟设备与实际基站的差异。实验室里模拟出来的弱网环境,跟真实地铁里的弱网环境,在延迟分布、丢包模型上是有差异的。所以实验室测出的结论只能作为参考,最终必须回到真实网络环境验一遍。
第四个坑是只测一次就下结论。5G真实网络波动太大,单次测试数据说明不了任何问题。特别是网络切换时延这类指标,同一台手机同一场景,测十次可能数值相差几倍。比较稳的做法是至少重复三次,记录最大值、最小值、均值,取均值评价,取极值做异常分析。
5.2 疑难问题的排查路线图
遇到疑难性能问题,我一般画一条排查路线图,沿着路线走,很少会绕弯路。
第一步,复现问题时记录详细的现场信息,包括系统版本、网络状态、屏幕亮度、后台进程、充电状态、操作步骤。很多问题难复现,就是因为没有留下可还原的环境条件。
第二步,用抓包工具看网络层的交互过程。重点看有没有大量重传、连接重置、长时间的空洞等待。网络层正常的话,再往应用层走。
第三步,用采集工具看主线程在做啥。主线程卡顿往往对应着主线程上执行了耗时操作,比如大数据量解析、文件IO、数据库查询、同步网络请求。主线程的任务时间线拉出来,问题通常就很明显了。
第四步,看内存和对象分配情况。频繁的GC也会导致卡顿,如果内存曲线呈锯齿状,就要查是不是循环创建对象、字符串拼接过多、或图片未复用。
第五步,看渲染链路。CPU提交时间、GPU绘制时间、垂直同步信号等待时间,这些数据能直接反映渲染瓶颈。
这条路线走完,大部分问题都能落到某一个具体环节。如果还定位不到,就把问题发到开发者社区,附上完整的抓包文件和性能采集数据,大神们通常能给到有效的思路。
5.3 几条值得分享的经验
最后分享几条做了这么多年性能测试的个人体会。
一是性能测试一定不能让业务人员催着做,要有固定的“性能回归机制”。我所在团队的做法是,每个业务版本发布前必须跑一轮性能冒烟,可以在CI流程里挂几个核心链路,提交代码的时候自动触发基础性能测试,性能指标突破阈值就直接失败,这样性能问题就不会拖到发版后才发现。
二是测试数据一定要留存归档。我这个习惯是从一次线上事故逼出来的:某次线上反馈新版本卡顿,但团队拿不出上一个版本的同场景性能数据做对比,排查难度剧增。后来规定每轮性能测试的数据和结论都必须归档,至少保留一年,出问题能回溯。
三是不管测试趋势怎么变,用户感知永远是第一位的。数据指标是手段,不是目的。测了一大堆数据,价值在于能找到用户抱怨背后的根因。我曾经花了很多时间优化一个数值看起来不怎么好看的指标,但后来发现它对用户实际体验几乎没什么影响,从那以后就养成了“每个指标都要关联用户场景”的习惯。
5G时代的性能测试还在快速发展,现在的做法一定不是终点。网络技术在变,应用形态在变,测试方法也会跟着变。但有一点不会变:只有真正贴近用户实际使用场景的测试,才能做出有价值的结果。希望这篇分享能给正在做移动性能测试的同学一些参考,少走一些我当时走过的弯路。