3

三年磨一剑,高德地图体验优化总结

 2 years ago
source link: https://my.oschina.net/alimobile/blog/5377693
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

三年磨一剑,高德地图体验优化总结 - 阿里巴巴移动技术 - OSCHINA - 中文开源技术交流社区

作者:杨夕凯、吴文扬

高德地图从19年开始对全链路性能体验进行了持续三年的优化,最终整体核心链路上实现了打对折优化,用户体验上大幅提升。过程中,对性能优化的一些思考和实践经验,本文进行了总结,希望对大家有些助益。

优化前后效果对比(以优化前的耗时为基线100%)

整体思路分为明确性能卡点,倒序专项解题和正序长线管控三个部分:

  • 明确性能卡点: 找到优化点才能有的放矢,科学的评测标准和明确的优化点对于优化至关重要,科学的评测标准需要能够合理评估性能体验的好坏,并更贴近用户的真实感受,而目标则需要可量化,这样才能够保住在专项过程中快速对焦高效执行,避免走弯路;
  • 倒序专项解题: 性能问题不是单一业务问题,往往涉及多个产研测团队协作,我们从问题出发快速倒序以专项形式凝聚多团队资源,确定目标,快速攻坚拿结果,增强团队信心;
  • 正序长线管控: 优化是从“果”倒退“因”的过程,已经发生问题了再去解决,是一种倒序解题的思路。那么如何让问题从“因”的源头上截住,或者说让已经优化的效果不发生倒退,那么我们的思路三是:长线持续的正序管控,避免原有业务的持续恶化,同时巩固专项的优化成果。

接下来,本位将针对这三个部分,逐一解析。

明确性能卡点

首屏加载速度的快慢极大影响着用户体验,所以首屏耗时作为我们页面耗时的统计标准。随着手机硬件的不断升级,很多高端设备硬件性能好掩盖了程序性能问题,因此我们会对不同机型等级设备进行优化,最大程度的覆盖到线上用户。

确定了首屏显示耗时是统计标准,下面是如何确定首屏显示耗时的几个维度:

  • 业务角度:业务形态各异,不同页面的首屏定义一定不同;
  • 产品角度:定义首屏围绕着功能使用量进行,高频功能优先;
  • 研发角度:通过业务流程上的日志埋点来锚定首屏的起终点;
  • 产研测拉通标准:建立统一的产研测沟通语言,那就是量化数据。
  • 机型等级:根据设备评分将设备分为高中低三种等级;
  • 选定机型:选定不同等级代表机型的准则,我们采取的是依据线上用户设备的占比,尽可能的覆盖比较多的用户,尽可能选取有代表性的厂商设备,当然也需要综合考虑现有测试实验室可用设备情况,毕竟采购不一定很及时和避免不必要的浪费。

确定优化项

高德地图长期以来的历史累计,导致每个场景的优化,都面临着复杂的业务代码,甚至还存在业务盲区。这就对快速分析历史大量业务,精确定位耗时点带来极大的挑战。如果靠人工梳理分析,人力投入和时长都不现实。这就需要从工具和方法论上找到加速方案。

自上而下明确优化点

  • 手机设备维度分析:

无限的业务场景通过移动设备运行在有限的性能资源上,资源分配势必捉襟见肘。所以我们需要根据设备的不同来分析耗时问题。比如在比较差的手机上出现的耗时问题,可能在高端的手机上并不是问题。优化点也不同,需要个性化策略来进行针对性优化。例如:低端机的复杂交互动画就是一个耗时点,比如搜索页面关闭一些动画,性能上带来不小的收益,同时也不损害用户体验,在高端机上这个耗时点就可以不考虑。

  • 业务平行维度分析:

业务点特别多,那么为什么我们要选择出行场景、搜索场景等去分析耗时呢?这就需要拉通产品和BI,用数据说话。通过分析线上用户行为,大部分用户选择了点击搜索框进入搜索首页,而线上用户反馈也是进入搜索卡顿耗时等,相比其他功能,搜索首页的及时性和重要性不言而喻,于是根据线上数据进行业务分级,该场景排在首位,性能资源应该向这里倾斜,需要首先分析这里的耗时点。

  • 业务内部维度分析:

首先对业务场景本身进行全链路梳理,找出其中的关键时间点,然后通过场景日志工具进行埋点并上传至服务,收集线上用户真正的首屏时间数据,为量化目标提供有效依据。其中两两关键点之间的时间戳差值即为阶段耗时,能辅助分析业务耗时问题。围绕着业务分析的过程我们还沉淀了很多分析工具来辅助分析。

最小集,加法,减法

最小集是一个探底的过程,在保证首屏产品形态不变形的情况下做出最小可运行,去掉其他所有跟首屏无关项,这就是减法。我们可以理解这个最小集是在不改变现有架构的情况下,我们最优的优化效果。如果最小集的极限数据达标,接下来就要在此基础上把必要的相关依赖项逐个加回来,保障产品功能完善,其他没必要的依赖性可以优化、或者去掉、或者延后等,这就是加法。当然如果这个最小集的极限数据都不能达标,那我们就需要从其他维度去寻找优化点了,一般能够从网络耗时和架构合理性两个方面找到突破点。

倒序专项解题

性能问题不是单一业务问题,往往涉及多个产研测团队协作。所以我们的思路是:

从问题出发快速倒序以专项形式凝聚多团队资源,确定目标,快速攻坚拿结果,增强团队信心

专项攻坚,也是个边打边建,边打边沉淀的过程。排查性能问题的手段最初是比较离散的。往往是遇到一个解决一个,下次不同的场景需要重复工作再来一遍,那么我们的思路是:

沉淀可复用方案,解题思想、通用框架和工具平台,针对“优化手段”本身的效率进行优化,让成本逐渐降低

启动专项是第一个性能专题项目,完成了一个场景优化,耗费30人,3个版本迭代。之所以人力比较多,是因为“第一次”面临的问题非常多,指标要分析定义标准、埋点工具要新建、优化过程没经验、管控手段要新建。

搜索专项完成了一个场景优化,耗费8人,人力情况就好了很多,版本变成2版。当时已经有启动期间已经建设好的埋点工具,有了一定的优化经验,少走了很多弯路。

核心链路专项完成了六个场景,耗费24人,一版搞定。优化的过程有条不紊,人力少、场景多、时间短。这得益于优化效率的提升,成本逐渐降低。在不断优化的过程中积累了相对成熟的分析工具、优化工具、管控工具。

性能优化是一个体系化问题,我们在优化方案上分为三层,业务、引擎和基础能力,分别自上而下明确优化点。上层业务进行自适应资源调度,中间引擎提供加速能力,底层能力提供高性能组件。

业务自适应资源调度

业务层优化主要通过业务编排调度来实现性能最优状态,但业务各自调度优化工作重复且繁琐。为了降低这部分成本,我们开发了一套资源调度框架,业务接入后,调度工作由框架完成。调度框架在应用运行过程中,感知采集运行环境,然后对不同环境状态进行不同的调度决策,生成相应的性能优化策略,最终根据优化策略执行对应优化功能。与此同时,监测调度上下文以及调度策略执行效果,并将其反馈给调度决策系统,从而为进一步的决策调优提供信息输入。这样,可以做到在不同的运行环境下都能达到可预期的极致性能体验。

一、环境感知

感知环境分为硬件设备、业务场景、用户行为和系统状态四个维度:

  • 硬件设备上,一方面通过集团实验室对已知设备进行评测跑分,以此确定高中低端机型,另一方面在用户设备上本地对硬件进行实时算力评估;
  • 业务场景上,将业务分为前台展示、后台运行、交互操作等几类,一般情况下前台正在进行交互操作的业务场景优先级最高,后台数据预处理业务场景优先级最低;对于同类别业务场景,根据业务UV、交易量、资源消耗等维度进行PK,确定细分优先级;
  • 用户行为上,结合服务用户画像和本地实时推算,确定用户功能偏好和操作习惯,为下一步针对用户的精准优化决策做准备;
  • 系统状态上,一方面通过系统提供接口,获取诸如内存警告、温度警告及省电模式等来获取系统极端状态,另一方面通过对内存、线程、CPU和电量进行监控,来实时确定系统性能资源情况。

二、调度决策

感知到环境状态之后,调度系统将结合各种状态与调度规则,进行业务以及资源调配决策。

  • 降级规则:在低端设备上或者系统资源紧张告警(如内存、温度告警)时,关闭高耗能功能或者低优先级功能
  • 避让规则:高优先级功能运行时,低优先级功能进行避让,如用户点击搜索框时到搜索结果完全展示的时间段内,后台低优任务进行暂停避让,保证用户交互体验;
  • 预处理规则:依据用户操作及习惯进行预处理,如某用户通常在启动3s后,点击搜索,则在3s之前对该用户搜索结果进行预加载,从而在用户点击时呈现极致的交互体验效果
  • 拥塞控制规则:在设备资源紧张时,主动降低资源申请量,如CPU繁忙时,主动降低线程并发量。这样在高优任务到来时,避免出现资源紧缺申请不到资源性能体验问题

三、策略执行

策略执行分为任务执行和硬件调优:其中任务执行,主要是通过内存缓存、数据库、线程池和网络库对相应任务的进行运行控制,来间接实现对各类资源的调度控制;而硬件调优,则是通过与系统厂商合作,直接对硬件资源进行控制;如CPU密集的高优业务开始运行时,将提高CPU频率,并将其运行线程绑定到大核上,避免线程来回切换损耗性能,最大化地调度系统资源来提升性能

四、效果监测

在资源调度过程中对各个模块进行监测,并将环境状态、调度策略、执行记录、业务效果、资源消耗等情况反馈给调度系统,调度系统则以此来评判本次调度策略的优劣,以做进一步的调优

引擎加速能力

一、地图引擎

地图引擎是地图应用独特的部分。这块主要从绘制优化策略入手,主要包括分批分块渲染、帧率调度、消息调度等。

二、跨端引擎

跨端引擎则需要给业务提供支撑,它也是全场景通用的方案,比客户端优化更有施展空间,与业务直接接触离业务够近。所以跨端引擎的优化策略就是降低业务代码的性能成本。主要方案有:

  • 线程提优先级
  • 上下文预加载
  • 业务框架复用
  • require引用复用

这里简单介绍下上下文预加载,为了不影响现有业务的运行状态,我们设计了一种闲时分段预加载的方案,能够在页面未进入之前,将页面需要计算的耗时、导入文件的耗时等提前执行。

  • 闲时:当业务线程空闲时再做预加载,避免影响其他页面
  • 分段:每次预加载的内容粒度小于16ms,避免预加载任务阻塞当前线程
  • 预加载:将目标页面的计算量提前,加速进入目标页面

三、H5容器

1、离线包加速

离线包加速,主要解决复杂 H5 页面的加载速度问题:资源文件数量较多,下载耗时较长,导致页面加载缓慢,通常通过增加loading来减少界面加载等待问题,从而导致用户等待耗时长,最终带来的是转换率流失。在此大背景下,结合高德已有的一些平台能力,搭建了离线包加速能力。整个链路包含:

  • 离线包构建:通过前端脚手架,提速业务开发效率,动态指定离线包资源配置;
  • 离线包发布:对接已有的服务发布能力,搭建前端可视化发布平台,提供灰度控制、包更新、数据统计等能力;
  • 端管理:包下载、管理、生效,控制下载及更新时机——对于高频页面进行预下载请求,打开页面时实现“秒开”;
  • 资源生效:容器内资源加载拦截,对接离线资源管理模块,命中缓存则直接生效,未命中走正常网络请求进行下载。

2、容器预创建

容器的预创建和预热,对于H5页面的加载速度将会有很大的提升,WebView的实例创建成本本身是相对较高的,在APP启动后合适的时机进行预创建并缓存复用,可以解决首次开启和二次加载的速度。AMap本身有启动任务编排及闲时任务调度,在此基础上可在对应WebView模块内进行预创建操作。对于预创建WebView Context切换问题,由于AMap的页面栈实际为自定义实现,仅有一个独立的Activity,因此具有天然的良好兼容性。对于预创建,本身是空间换时间的一种做法,对于不同性能设备的差异化配置,需要重点打磨——此外,也可以结合端智能的特征行为,类似用户页面跳转的行为习惯及频次等,来动态决策是否需要进行预创建。

架构高性能组件

一、线程池

线程池支持业务进行任务优先级编排、线程总数控制、线程避让等调度策略,使设备资源得到充分合理的利用。

线程队列管理模块,其提供5个优先级队列:

  • 高优队列:用于处理 UI 相关的任务,能够快速返回执行结果,如启动阶段高优任务等;
  • 次高优队列:用于执行需要立即返回的任务,如业务page文件加载等;
  • 普通(低优)队列:主要用于不需要立即返回的任务,如网络请求;
  • 后台(最低优)队列:用于处理一些用户不会感知的任务,如埋点、耗时的IO操作等;
  • 主线程闲时队列:用于处理不需要立即执行,但业务又不支持按需执行的任务,只有在主线程检测处于空闲状态时才会执行

二、网络库

网路请求作为场景中耗时大头,其性能表现几乎决定了场景首屏耗时表现,我们针对网络请求的各个环节,做了链路监控与极致优化,重点包含:请求精细化调度、并发预处理、DNS预加载、连接复用等。

请求链路示意图:

  • 排队:对请求进行精细化调度;对线程资源分级,高优请求有自己独立的资源,同时资源可以高占低,但低不能占高,实现高优请求 0 排队。同时限制低优请求并发量,避免并发过多导致底层带宽抢占;
  • 预处理:主要包含公参、签名、加密等一系列耗时操作,将预处理操作从原来的串行转为并行,压低预处理耗时;
  • DNS解析:常用域名做白名单,在启动时即会进行常用域名DNS预解析,真正使用时,实现解析0耗时;
  • 建连:通过使用h2长连接、预建连等策略,实现建连几乎0耗时;
  • 请求上/下行:根据body大小,智能判断是否需要压缩,降低body大小,减少传输耗时;
  • 解析回调:针对响应较复杂的场景(如规划),使用更高效的数据协议格式(如pb),降低数据大小&解析时间。

正序长线管控

优化是从“果”倒退“因”的过程,已经发生问题了再去解决,是一种倒序解题的思路。那么如何让问题从“因”的源头上截住,或者说让已经优化的效果不发生倒退,那么我们的思路三是:

长线持续的正序管控,避免原有业务的持续恶化,同时巩固专项的优化成果。

高德地图客户端横向业务上包含出行、搜索、打车等业务线,纵向架构上包含业务层、平台适配层、跨端引擎层和地图引擎层,跨多个语言栈,性能问题具有跟进流程长和排查链路长的特点。因此管控思路集中在标准、流程、自动化平台和工具的建设上。

在经过全面的专项治理后,性能管控的目标和要求是避免持续恶化的状态,由于测试波动的存在及热更、快速迭代、动态化插件的频繁发布,需要管控的出口非常多,如果存在管控遗漏区,性能就会不可避免的持续恶化。因此管控标准确定为以固定基线为基准,以环比数值为量化标准,把所有变化因素都包含到管控中,有效防止叠加恶化。

高德客户端主版流程主要分为三个大阶段:需求分析和设计、业务独立迭代开发、集成测试,集成测试阶段本身有大量的业务BUG,所以留给性能问题发现和解决的时间非常紧张,为了解决这些问题,管控流程需要利用好主版流程的每一个阶段,分阶段消灭性能问题。

  • 需求分析和方案设计计算,提前识别问题;
  • 迭代开发阶段,提前发现和解决问题,降低性能问题暴露晚导致来不及修复,影响线上用户体验的风险;
  • 集成测试阶段每天汇总数据大盘,及时发现问题,依托平台和工具快速排查,加速问题流转;
  • 灰度和发布阶段关注线上数据大盘,建立报警机制,及时发现问题,通过用户日志排查线上问题。

依托泰坦持续集成平台和ATap自动化测试平台,打造连通开发,构建,性能测试,问题跟进、排查、流转、解决完整链路的工具链,提高问题发现和解决的效率。

  • 泰坦持续集成平台

    • 定时构建,支持定位出包任务,构建类型支持性能包

    • 自动化测试触发,支持打包触发和定时触发两种触发方式

    • 集成卡口及决策,集成申请展示性能测试结果,集成决策审批流程

  • ATap自动化测试平台

    • 性能大盘,汇总性能数据,快速发现问题

    • 埋点详情,整合快速排查工具,加速排查

    • 问题跟进,结合Aone,监控问题解决流程,加速流转

目前为止,高德核心链路的性能体验优化效果得到了较大的提升。从最初的拿到优化结果,到后来的优化效率提升,优化成本降低。整体的优化进程总结下来:

  • 战术上,采用“专项”+“技术沉淀”+“长线管控”的方式,能够保障性能体验问题得到良性解决。
  • 战略上,过去我们靠“人”解决问题,现在我们靠“人”、“架构”和“工具”解决问题。未来是否能够“工具”自己解决问题或者避免出现问题呢?随着“技术沉淀”积累的工具和“长线管控”建设的平台不断增加,相信量变引起质变只是时间问题。

关注【阿里巴巴移动技术】微信公众号,每周 3 篇移动技术实践&干货给你思考!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK