随着移动互联网的成熟发展,移动应用技术上呈现出多样化的趋势,业务上倾向打造平台及超级入口,超级应用应运而生。但业务快速扩张与有限的系统资源必然是冲突的,如何实现多(能力服务的高增加)、快(体验流畅)、好(兼容稳定)、省(资源成本低),让大象也能跳舞,成为摆在超级应用面前必须解决的问题。
伴随着高德地图APP近几年的高速发展,也面临到这些问题,从2019年开始,咱们开启了一系列性能优化专项,对高德地图APP进行了深刻性能分析和极致优化,取得比较显著的效果。在这个过程当中总结了一系列优化思路和技术方案,但愿对一样面临超级应用性能问题的你有所帮助。
通过一系列优化动做,咱们在保证业务需求正常迭代新增的基础上,启动、核心链路交互、行中内存、包大小等多方面均实现了性能的成倍提高,尤为是低端机上达到了3倍+的提高,从多个维度改善了用户性能体验。
-
启动攻坚:启动耗时下降70%+,实现2s地图元素完成展现,并管控保持在稳定低水位,呈降低趋势。
-
核心链路交互优化:在搜索、路线等链路上实现中高端机型秒开、低端机型2s内打开,总体提高用户流畅交互体验 。
-
行中内存优化:全机型优化了30%左右,提升稳定性。
-
包大小攻坚:双端体积下降20%,提升安装转换率。
某段时间,高德地图APP面临着性能恶化、管控困难的问题。以启动耗时为例,双端启动等待体感明显,而且历史上治理后出现反复,总体呈上升趋势,咱们思考问题背后的问题,主要有如下几个方面:
超级应用通常都经历这样的发展过程。首先,应用提供服务给用户,用户开始增加,增加的用户会产生更多的需求。应用为知足新增需求不断迭代,提供新的服务。新的服务推进用户进一步增加,进入下一个循环。正是在这个正循环发展中,应用像滚雪球同样越滚越大,终于成为超级应用。
然而,随着业务需求的不断增加,业务量和复杂度也随着上升,系统资源会越占越多。但机器资源是有限的,资源的争夺不可避免地会致使性能问题,从而影响用户体验和业务扩展,成为超级应用正循环发展的拦路虎。
高德地图也一样经历了这样的过程,随着这几年的快速发展,应用从手机扩展到了车机,平台从iOS、Android扩展了Windows和Liunx,覆盖10多种出行方式的同时,还在不断提供组队、视频、语音、AR等新服务。与此相应的是单端代码行超百万行,线程上百,任务上千,形成了持续的性能压力。
性能问题面临的另外一个主要挑战是超级应用的环境复杂。一方面,随着移动设备的长线发展,系统碎片化状况愈来愈严重,Android系统横跨11个主版本,iOS横跨14个主版本,加之设备厂商对系统进行各类各样的改造,进一步增长了系统的碎片化;另外一方面,用户移动设备的环境是很是不稳定的,电量、温度的变化以及其余应用的抢占都会形成内存、CPU、GPU等资源波动。复杂不可控的环境为一致的性能体验的保持增长了很大的难度。
但做为大用户体量的超级应用,任何环境的体验都要保证。特别是地图领域,用户习惯对不一样产品直接对比,任何环境下性能体验问题,都会直接影响产品的总体口碑,致使用户流失。因此须要兼顾全部环境,不仅是主流机型系统和场景,在长尾场景与机型系统上也必须流畅运行,这就要求超级应用这头大象不但要在舞台上跳舞,在凳子上、甚至在水里也能跳舞。
为了知足研发效率提高、产品动态化等多样需求,移动应用技术上除支持原生开发外,也要支持小程序、Web H五、C基础库等跨平台、容器化、动态化开发。从高德APP来看,最顶层业务除了OC、Java外,还支持JS开发。支撑层提供了AJX、小程序、原生、C等多种容器框架,同时还涉及JS、JNI等桥接层。最下面则用C++提供地图各个引擎能力,这里包括OpenGL、定位传感器融合等多种底层能力。技术链路自上而下开始变得长且复杂,链路上任何一环均可能致使性能问题,原有的单技术语言的排查工具已经没法定位明确性能卡点模块,为性能排查和管控带来挑战。
基于上面的问题,原有传统的一招鲜的优化方案,显然解决不了需求日益增加和复杂环境下的性能一致体验。因此,咱们在专项实践过程当中,沉淀了一套自适应资源调度框架,解决历史性能问题的同时,可以在不影响现有的研发效率的状况下,低成本优化迁移,实现新业务高性能的开发。此外,从系统底层进行全维度资源监控,自动定位分发问题,来实现长线管控,避免先治理后反弹的状况。
自适应资源调度框架在应用运行过程当中,感知采集运行环境。而后对不一样环境状态进行不一样的调度决策,生成相应的性能优化策略,最终根据优化策略执行对应优化功能。与此同时,监测调度上下文以及调度策略执行效果,并将其反馈给调度决策系统,从而为进一步的决策调优提供信息输入。这样,能够作到在不一样的运行环境下都能达到可预期的极致性能体验。而且,整个过程,对业务无需额外开发,作到无感接入,避免影响业务开发效率。
感知环境分为硬件设备、业务场景、用户行为和系统状态四个维度:
-
硬件设备上,一方面经过集团实验室对已知设备进行评测跑分肯定高中低端机型,另外一方面在用户设备上本地对硬件进行实时算力评估。
-
业务场景上,将业务分为前台展现、后台运行、交互操做等几类,通常状况下前台正在进行交互操做的业务场景优先级最高,后台数据预处理业务场景优先级最低。对于同类别业务场景,根据业务UV、交易量、资源消耗等维度进行PK,肯定细分优先级。
-
用户行为上,结合服务用户画像和本地实时推算,肯定用户功能偏好和操做习惯,为下一步针对用户的精准优化决策作准备。
-
系统状态上,一方面经过系统提供接口获取诸如内存警告、温度警告及省电模式等来获取系统极端状态,另外一方面经过对内存、线程、CPU和电量进行监控,来实时肯定系统性能资源状况。
感知到环境状态以后,调度系统将结合各类状态与调度规则,进行业务以及资源调配决策:
-
降级规则:在低端设备上或者系统资源紧张告警(如内存、温度告警)时,关闭高耗能功能或者低优先级功能。
-
避让规则:高优先级功能运行时,低优先级功能进行避让,如用户点击搜索框时到搜索结果彻底展现到时间段内,后台低优任务进行暂停避让,保证用户交互体验。
-
预处理规则:依据用户操做及习惯进行预处理,如某用户一般在启动3s后,点击搜索,则在3s以前对该用户搜索结果进行预加载,从而在用户点击时呈现极致的交互体验效果。
-
拥塞控制规则:在设备资源紧张时,主动下降资源申请量,如CPU繁忙时,主动下降线程并发量;这样在高优任务到来时,避免出现资源紧缺申请不到资源性能体验问题。
策略执行分为任务执行和硬件调优:其中任务执行,主要是经过内存缓存、数据库、线程池和网络库对相应任务的进行运行控制,来间接实现对各种资源的调度控制。而硬件调优,则是经过与系统厂商合做,直接对硬件资源进行控制,如CPU密集的高优业务开始运行时,将提升CPU频率,并将其运行线程绑定到大核上,避免线程来回切换损耗性能,最大化地调度系统资源来提高性能。
在资源调度过程当中对各个模块进行监测,并将环境状态、调度策略、执行记录、业务效果、资源消耗等状况反馈给调度系统,调度系则统以此来评判本次调度策略的优劣,以作进一步的调优。
因为技术链路长、关联模块复杂,原来出现性能问题时,须要全部相关方集中排查,check全部的改动代码,依赖我的经验判断代码的成原本定位问题,协做和排查成本都很高,致使性能管控有效落地阻力很大。因此咱们就思考,性能问题的根本是硬件资源的竞争,那能不能逆向解题,反过来对资源成本进行监控,若是发现异常再回溯产生成本的代码,以及分发给相应owner.
那基于这个思路,在构建的时候,首先经过代码扫描创建代码模块关联库。而后,进行成本和调用栈采集。采集完成后,对基线版本和当前版本的成本进行对比,若是发现异常,则经过符号反解异常成本的调用栈直接定位到问题代码。另外,基于问题代码查找代码模块关联库,来定位问题模块,最后将问题准确分发给模块相应的owner,最终实现问题的自动定位和分发,支持团队并行解题。
性能的有效长线管控,除了上面的资源监控平台,还须要配套的流程体系及组织保障。因此在APP的生命周期每一个阶段都创建了从测试分析到修复验证的闭环管控。前置监控在迭代开发阶段,早发现早解决。在集成阶段监控每个改动,保证及时处理。线上经过实时监控和动态下发,实现快速修复。
超级应用的性能问题每每关联多方业务,须要多方团队协做,因此自上而下对性能的重视程度和优化决心是决定成败的关键,打通任督二脉,才能事半功倍,把优化方案顺利落地。
业务与技术都在快速迭代,要想保证优化成果防止反弹,管控是必须的,而管控就会有束缚和效率影响,管控过程当中就不免会遇到各类各样的阻力。因此一方面技术上,创建标准规则,配合提效工具和优化流程,尽可能避免影响业务开发。另外一方面,团队须要具备共同认知,性能体验与功能体验同等重要,用户对比心智很强,性能体验每每与产品口碑直接挂钩。
目前,咱们不少优化策略以及数据参数仍是从实验室调校而来。将来,咱们会进一步探索云端一体、端智能等技术,作到更懂用户,贴合业务和用户特色,实现性能体验的个性化提高。