写点什么

历时 1 年,上百万行代码!首次揭秘手淘全链路性能优化(一)

  • 2019-12-23
  • 本文字数:1323 字

    阅读完需:约 4 分钟

历时1年,上百万行代码!首次揭秘手淘全链路性能优化(一)


导读:自阿里在 11 年提出 All in 无线之后,手淘慢慢成长为承载业务最多,体量巨大的航母级移动端应用。与之相应的,手淘离轻量,快速,敏捷这些关键词却越来越远,启动慢,使用卡逐步成为用户使用过程中的主要体验问题。为此,手淘的技术团队启动了极速版项目,其目标是还给用户一个更加流畅的淘宝。整个项目历时近 1 年,横跨几十个团队,经历了数百次的数据实验,涉及代码上百万行,最终使得手淘的性能有一个质的飞跃。


下面,我们一起来看手淘团队在性能优化过程中的一些思考和实践。

启动框架的思考

▐ 启动框架在手淘的意义


启动性能,是用户在使用 APP 过程中的第一感观,可见是相当重要的。相信很多同学都能说出一些常规的手段,比如只加载必要的模块,延迟加载等。从大的策略上说,是没有问题的,也是手淘做启动性能优化的一个方向,也得了一些效果,但仍存在一些问题。


前面提到,手淘承载的业务非常多,为了更好支撑业务,使用了动态化技术及一些非常复杂的策略,就首页本身依赖的模块和任务就非常多,相互关系也复杂,只加载必要任务,仍然是一笔不小的开销。于是,为了更加极致的优化,我们不得不继续思考性能优化的本质。


通常我们为了更快的达到目标,把与目标无关的事情,提到完成目标之后,通过减少执行代码从而减少执行时间的方式,叫着软优化。相对的,对于提升系统的吞吐效率,对于相同的代码用更少的执行时间完成,叫着硬优化。硬优化是面向硬件资源,包括 CPU,内存,网络,磁盘 IO 等的调度,减少等待时间,最大化利用硬件资源,保持系统负载在合理范围内。


这次优化我们有一个大的原则,要求基本不能影响业务需求,也就是要在不减任何业务代码的情况下进行优化。


对手淘而言,因为启动包含很多基础 SDK,SDK 的初始化有着一定的先后顺序;业务 SDK 又是围绕着多个基础 SDK 建立的。


那么如何保证这些 SDK 在正确的阶段、按照正确的依赖顺序、高效地初始化?怎么合理调度任务,才不至于让系统负载过高?如何最大化利用设备的性能,承接越来越多的业务?


其实启动框架就是一个任务调度系统,是手淘启动的“大管家”。各个业务模块我们称之为启动任务,管家要做的事情就是把它们的关系梳理得明明白白,有条不紊,合理安排位置、调度时间,同时提升硬件资源的利用率。


▐ 启动框架的思路


总结下来无非就是两点:一是 如何保证时序 ;二是 怎么控制拥塞,提高吞吐,充实不瞎忙。我们先看一组实验数据,在并发下面的 IO 性能。


启动任务 高并发 IO 耗时 低并发 IO 耗时



由表上的数据可以看到降低 IO 的并发,整体的执行时间大幅降低。


我们借鉴了很多任务调度系统。比如谷歌新出的 WorkManager,再比如 Spark 的 DAGScheduler。


从 Spark 的 DAGScheduler 中领悟到它的核心思想,面向阶段调度(Stage-Oriented Scheduler):把应用划分成一个个的阶段(Stage),再把任务(Task)安排到各个阶段中去,任务的编排则是通过构建 有向无环图(DAG),把任务依赖通过图的方式梳理得 井井有条。因为它分阶段执行,先集中资源把阶段一搞定,再齐心协力去执行阶段二,这样即能控制拥塞,又能保证时序,还能并发执行,让设备性能尽可能得到发挥,岂不美哉:



本文转载自淘系技术公众号。


原文链接:https://mp.weixin.qq.com/s/PiqnHezWKWUU0byEhrboRg


2019-12-23 18:181114

评论

发布
暂无评论
发现更多内容

网络攻防学习笔记 Day17

穿过生命散发芬芳

5月日更 网络攻防

图说丨一图看懂浪潮云“1231”业务战略

用ABAP 生成二维码 QR Code

汪子熙

二维码 SAP abap

2021最热门的20个数据库学习总结,你会用哪几个?

北游学Java

Java MySQL 数据库 后端

SpringCloud微服务架构实战:Feign+Hystrix实现RPC调用保护

小Q

Java 学习 面试 微服务 spring cloud alibaba

☕️【Java技术之旅】带你看透Lambda表达式的本质

码界西柚

Java Lambda java8 Lambda函数 5月日更

Flink消费Kafka

大数据技术指南

大数据 flink 5月日更

“技术+应用”驱动金融科技创新融合

CECBC

金融

对比解读《2020年CNCF中国云原生调查报告》

阿里巴巴中间件

基于Agora Web SDK自定义直播画面

dajyaretakuya

WebRTC 声网 Agora 数字合成

业界率先支持 MCP-OVER-XDS 协议,Nacos 2.0.1 + 1.4.2 Release 正式发布

阿里巴巴云原生

容器 微服务 云原生 k8s 中间件

架构实战营模块四总结

竹林七贤

15年云原生实践,在关键节点我们做对了什么? | 云原生大咖说

阿里巴巴中间件

ElasticSearch架构剖析

五分钟学大数据

大数据 elasticsearch 5月日更

进大厂的iOS程序员,原来是这样“跳槽”的!

iOS猿_员

中国区块链第一村的价值裂变

CECBC

“碳中和”目标下的绿色金融探索

CECBC

金融

重磅成果 | 《数据安全治理白皮书3.0》正式对外发布!

DT极客

Keycloak 13 自定义用户身份认证流程(User Storage SPI)

Zhang

MySQL spi keycloak 13.0.0 user storage spi

打破思维定式(十一)

Changing Lin

2021 iOS 进阶学习视频推荐

程序员 ios开发

CRM Transaction处理中的权限控制

汪子熙

CRM SAP abap

5分钟速读之Rust权威指南(三)

wzx

rust

云小课 | 一个三分钟快速定制OCR应用的神器,要不?

华为云开发者联盟

AI modelarts OCR ModelArts Pro 开发套件

全链路压测二十问干货汇总(上)

TakinTalks稳定性社区

Python--TKinter

若尘

Python编程 5月日更

有无社保缴纳识别接口

ALone

被解救的代码 - 代码即服务时代来了!

阿里巴巴云原生

容器 微服务 开发者 云原生 开发工具

腾讯校招都会问些什么?| 五面腾讯(Java岗)经历分享

Java架构师迁哥

新融合,新跳板:智能云网如何让企业数字化转型,起步即领先?

脑极体

从基础到实战一应俱全,这份全网首发的Kafka技术手册,超详细!

Java架构师迁哥

历时1年,上百万行代码!首次揭秘手淘全链路性能优化(一)_语言 & 开发_淘系技术_InfoQ精选文章