作者:杨夕凯、吴文扬
高德地图从 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 篇挪动技术实际 & 干货给你思考!