三年磨一剑,高德地图体验优化总结
文章图片
作者:杨夕凯、吴文扬
高德地图从19年开始对全链路性能体验进行了持续三年的优化,最终整体核心链路上实现了打对折优化,用户体验上大幅提升。过程中,对性能优化的一些思考和实践经验,本文进行了总结,希望对大家有些助益。
文章图片
优化前后效果对比(以优化前的耗时为基线100%)
思路
整体思路分为明确性能卡点,倒序专项解题和正序长线管控三个部分:
- 明确性能卡点: 找到优化点才能有的放矢,科学的评测标准和明确的优化点对于优化至关重要,科学的评测标准需要能够合理评估性能体验的好坏,并更贴近用户的真实感受,而目标则需要可量化,这样才能够保住在专项过程中快速对焦高效执行,避免走弯路;
- 倒序专项解题: 性能问题不是单一业务问题,往往涉及多个产研测团队协作,我们从问题出发快速倒序以专项形式凝聚多团队资源,确定目标,快速攻坚拿结果,增强团队信心;
- 正序长线管控: 优化是从“果”倒退“因”的过程,已经发生问题了再去解决,是一种倒序解题的思路。那么如何让问题从“因”的源头上截住,或者说让已经优化的效果不发生倒退,那么我们的思路三是:长线持续的正序管控,避免原有业务的持续恶化,同时巩固专项的优化成果。
明确性能卡点 制定标准 首屏加载速度的快慢极大影响着用户体验,所以首屏耗时作为我们页面耗时的统计标准。随着手机硬件的不断升级,很多高端设备硬件性能好掩盖了程序性能问题,因此我们会对不同机型等级设备进行优化,最大程度的覆盖到线上用户。
统计标准
确定了首屏显示耗时是统计标准,下面是如何确定首屏显示耗时的几个维度:
- 业务角度:业务形态各异,不同页面的首屏定义一定不同;
- 产品角度:定义首屏围绕着功能使用量进行,高频功能优先;
- 研发角度:通过业务流程上的日志埋点来锚定首屏的起终点;
- 产研测拉通标准:建立统一的产研测沟通语言,那就是量化数据。
- 机型等级:根据设备评分将设备分为高中低三种等级;
- 选定机型:选定不同等级代表机型的准则,我们采取的是依据线上用户设备的占比,尽可能的覆盖比较多的用户,尽可能选取有代表性的厂商设备,当然也需要综合考虑现有测试实验室可用设备情况,毕竟采购不一定很及时和避免不必要的浪费。
自上而下明确优化点
- 手机设备维度分析:
- 业务平行维度分析:
- 业务内部维度分析:
最小集,加法,减法
文章图片
最小集是一个探底的过程,在保证首屏产品形态不变形的情况下做出最小可运行,去掉其他所有跟首屏无关项,这就是减法。我们可以理解这个最小集是在不改变现有架构的情况下,我们最优的优化效果。如果最小集的极限数据达标,接下来就要在此基础上把必要的相关依赖项逐个加回来,保障产品功能完善,其他没必要的依赖性可以优化、或者去掉、或者延后等,这就是加法。当然如果这个最小集的极限数据都不能达标,那我们就需要从其他维度去寻找优化点了,一般能够从网络耗时和架构合理性两个方面找到突破点。
倒序专项解题 性能问题不是单一业务问题,往往涉及多个产研测团队协作。所以我们的思路是:
从问题出发快速倒序以专项形式凝聚多团队资源,确定目标,快速攻坚拿结果,增强团队信心
专项攻坚 专项攻坚,也是个边打边建,边打边沉淀的过程。排查性能问题的手段最初是比较离散的。往往是遇到一个解决一个,下次不同的场景需要重复工作再来一遍,那么我们的思路是:
沉淀可复用方案,解题思想、通用框架和工具平台,针对“优化手段”本身的效率进行优化,让成本逐渐降低
文章图片
启动专项是第一个性能专题项目,完成了一个场景优化,耗费30人,3个版本迭代。之所以人力比较多,是因为“第一次”面临的问题非常多,指标要分析定义标准、埋点工具要新建、优化过程没经验、管控手段要新建。
搜索专项完成了一个场景优化,耗费8人,人力情况就好了很多,版本变成2版。当时已经有启动期间已经建设好的埋点工具,有了一定的优化经验,少走了很多弯路。
核心链路专项完成了六个场景,耗费24人,一版搞定。优化的过程有条不紊,人力少、场景多、时间短。这得益于优化效率的提升,成本逐渐降低。在不断优化的过程中积累了相对成熟的分析工具、优化工具、管控工具。
优化方案 性能优化是一个体系化问题,我们在优化方案上分为三层,业务、引擎和基础能力,分别自上而下明确优化点。上层业务进行自适应资源调度,中间引擎提供加速能力,底层能力提供高性能组件。
文章图片
业务自适应资源调度
业务层优化主要通过业务编排调度来实现性能最优状态,但业务各自调度优化工作重复且繁琐。为了降低这部分成本,我们开发了一套资源调度框架,业务接入后,调度工作由框架完成。调度框架在应用运行过程中,感知采集运行环境,然后对不同环境状态进行不同的调度决策,生成相应的性能优化策略,最终根据优化策略执行对应优化功能。与此同时,监测调度上下文以及调度策略执行效果,并将其反馈给调度决策系统,从而为进一步的决策调优提供信息输入。这样,可以做到在不同的运行环境下都能达到可预期的极致性能体验。
文章图片
一、环境感知 感知环境分为硬件设备、业务场景、用户行为和系统状态四个维度:
- 硬件设备上,一方面通过集团实验室对已知设备进行评测跑分,以此确定高中低端机型,另一方面在用户设备上本地对硬件进行实时算力评估;
- 业务场景上,将业务分为前台展示、后台运行、交互操作等几类,一般情况下前台正在进行交互操作的业务场景优先级最高,后台数据预处理业务场景优先级最低;对于同类别业务场景,根据业务UV、交易量、资源消耗等维度进行PK,确定细分优先级;
- 用户行为上,结合服务用户画像和本地实时推算,确定用户功能偏好和操作习惯,为下一步针对用户的精准优化决策做准备;
- 系统状态上,一方面通过系统提供接口,获取诸如内存警告、温度警告及省电模式等来获取系统极端状态,另一方面通过对内存、线程、CPU和电量进行监控,来实时确定系统性能资源情况。
- 降级规则:在低端设备上或者系统资源紧张告警(如内存、温度告警)时,关闭高耗能功能或者低优先级功能
- 避让规则:高优先级功能运行时,低优先级功能进行避让,如用户点击搜索框时到搜索结果完全展示的时间段内,后台低优任务进行暂停避让,保证用户交互体验;
- 预处理规则:依据用户操作及习惯进行预处理,如某用户通常在启动3s后,点击搜索,则在3s之前对该用户搜索结果进行预加载,从而在用户点击时呈现极致的交互体验效果
- 拥塞控制规则:在设备资源紧张时,主动降低资源申请量,如CPU繁忙时,主动降低线程并发量。这样在高优任务到来时,避免出现资源紧缺申请不到资源性能体验问题
四、效果监测 在资源调度过程中对各个模块进行监测,并将环境状态、调度策略、执行记录、业务效果、资源消耗等情况反馈给调度系统,调度系统则以此来评判本次调度策略的优劣,以做进一步的调优
引擎加速能力
一、地图引擎 地图引擎是地图应用独特的部分。这块主要从绘制优化策略入手,主要包括分批分块渲染、帧率调度、消息调度等。
二、跨端引擎 跨端引擎则需要给业务提供支撑,它也是全场景通用的方案,比客户端优化更有施展空间,与业务直接接触离业务够近。所以跨端引擎的优化策略就是降低业务代码的性能成本。主要方案有:
- 线程提优先级
- 上下文预加载
- 业务框架复用
- require引用复用
- 闲时:当业务线程空闲时再做预加载,避免影响其他页面
- 分段:每次预加载的内容粒度小于16ms,避免预加载任务阻塞当前线程
- 预加载:将目标页面的计算量提前,加速进入目标页面
离线包加速,主要解决复杂 H5 页面的加载速度问题:资源文件数量较多,下载耗时较长,导致页面加载缓慢,通常通过增加loading来减少界面加载等待问题,从而导致用户等待耗时长,最终带来的是转换率流失。在此大背景下,结合高德已有的一些平台能力,搭建了离线包加速能力。整个链路包含:
- 离线包构建:通过前端脚手架,提速业务开发效率,动态指定离线包资源配置;
- 离线包发布:对接已有的服务发布能力,搭建前端可视化发布平台,提供灰度控制、包更新、数据统计等能力;
- 端管理:包下载、管理、生效,控制下载及更新时机——对于高频页面进行预下载请求,打开页面时实现“秒开”;
- 资源生效:容器内资源加载拦截,对接离线资源管理模块,命中缓存则直接生效,未命中走正常网络请求进行下载。
容器的预创建和预热,对于H5页面的加载速度将会有很大的提升,WebView的实例创建成本本身是相对较高的,在APP启动后合适的时机进行预创建并缓存复用,可以解决首次开启和二次加载的速度。AMap本身有启动任务编排及闲时任务调度,在此基础上可在对应WebView模块内进行预创建操作。对于预创建WebView Context切换问题,由于AMap的页面栈实际为自定义实现,仅有一个独立的Activity,因此具有天然的良好兼容性。对于预创建,本身是空间换时间的一种做法,对于不同性能设备的差异化配置,需要重点打磨——此外,也可以结合端智能的特征行为,类似用户页面跳转的行为习惯及频次等,来动态决策是否需要进行预创建。
架构高性能组件
一、线程池 线程池支持业务进行任务优先级编排、线程总数控制、线程避让等调度策略,使设备资源得到充分合理的利用。
线程队列管理模块,其提供5个优先级队列:
- 高优队列:用于处理 UI 相关的任务,能够快速返回执行结果,如启动阶段高优任务等;
- 次高优队列:用于执行需要立即返回的任务,如业务page文件加载等;
- 普通(低优)队列:主要用于不需要立即返回的任务,如网络请求;
- 后台(最低优)队列:用于处理一些用户不会感知的任务,如埋点、耗时的IO操作等;
- 主线程闲时队列:用于处理不需要立即执行,但业务又不支持按需执行的任务,只有在主线程检测处于空闲状态时才会执行
请求链路示意图:
文章图片
- 排队:对请求进行精细化调度;对线程资源分级,高优请求有自己独立的资源,同时资源可以高占低,但低不能占高,实现高优请求 0 排队。同时限制低优请求并发量,避免并发过多导致底层带宽抢占;
- 预处理:主要包含公参、签名、加密等一系列耗时操作,将预处理操作从原来的串行转为并行,压低预处理耗时;
- DNS解析:常用域名做白名单,在启动时即会进行常用域名DNS预解析,真正使用时,实现解析0耗时;
- 建连:通过使用h2长连接、预建连等策略,实现建连几乎0耗时;
- 请求上/下行:根据body大小,智能判断是否需要压缩,降低body大小,减少传输耗时;
- 解析回调:针对响应较复杂的场景(如规划),使用更高效的数据协议格式(如pb),降低数据大小&解析时间。
长线持续的正序管控,避免原有业务的持续恶化,同时巩固专项的优化成果。
高德地图客户端横向业务上包含出行、搜索、打车等业务线,纵向架构上包含业务层、平台适配层、跨端引擎层和地图引擎层,跨多个语言栈,性能问题具有跟进流程长和排查链路长的特点。因此管控思路集中在标准、流程、自动化平台和工具的建设上。
文章图片
[]()
标准 在经过全面的专项治理后,性能管控的目标和要求是避免持续恶化的状态,由于测试波动的存在及热更、快速迭代、动态化插件的频繁发布,需要管控的出口非常多,如果存在管控遗漏区,性能就会不可避免的持续恶化。因此管控标准确定为以固定基线为基准,以环比数值为量化标准,把所有变化因素都包含到管控中,有效防止叠加恶化。
流程 高德客户端主版流程主要分为三个大阶段:需求分析和设计、业务独立迭代开发、集成测试,集成测试阶段本身有大量的业务BUG,所以留给性能问题发现和解决的时间非常紧张,为了解决这些问题,管控流程需要利用好主版流程的每一个阶段,分阶段消灭性能问题。
- 需求分析和方案设计计算,提前识别问题;
- 迭代开发阶段,提前发现和解决问题,降低性能问题暴露晚导致来不及修复,影响线上用户体验的风险;
- 集成测试阶段每天汇总数据大盘,及时发现问题,依托平台和工具快速排查,加速问题流转;
- 灰度和发布阶段关注线上数据大盘,建立报警机制,及时发现问题,通过用户日志排查线上问题。
- 泰坦持续集成平台
- 定时构建,支持定位出包任务,构建类型支持性能包
- 自动化测试触发,支持打包触发和定时触发两种触发方式
- 集成卡口及决策,集成申请展示性能测试结果,集成决策审批流程
- ATap自动化测试平台
- 性能大盘,汇总性能数据,快速发现问题
- 埋点详情,整合快速排查工具,加速排查
- 问题跟进,结合Aone,监控问题解决流程,加速流转
文章图片
总结 目前为止,高德核心链路的性能体验优化效果得到了较大的提升。从最初的拿到优化结果,到后来的优化效率提升,优化成本降低。整体的优化进程总结下来:
- 战术上,采用“专项”+“技术沉淀”+“长线管控”的方式,能够保障性能体验问题得到良性解决。
- 战略上,过去我们靠“人”解决问题,现在我们靠“人”、“架构”和“工具”解决问题。未来是否能够“工具”自己解决问题或者避免出现问题呢?随着“技术沉淀”积累的工具和“长线管控”建设的平台不断增加,相信量变引起质变只是时间问题。
推荐阅读
- 【Thesewt】蒙昧(续)
- 栉风沐雨经磨砺|栉风沐雨经磨砺,行远自迩再登攀
- 夜……
- 戒烟(算了,别折磨自己了!)
- 【武侠】一剑霜雪寂寒宵(31)
- 来到“社会磨坊”的第二天
- 第十章,走散
- 三年级英语期中考试试卷分析
- 读帖学书法
- 读经日记20