说到系统软件,很多人都不太清楚,甚至包括编程多年的老兵。但那些出色的系统软件工程师却往往和伟大、传奇、卓越相关联,如 Linux 之父 Linus Torvalds,Java 之父 James Gosling 等等。他们都是程序员界的翘楚与先锋,是整个软件世界进步的杰出贡献者,系统软件工程师在普通人眼里也是神秘的存在。
随着云技术的蓬勃发展,从容器开始星火燎原,到调度系统的大爆发,云原生成为炙手可热的名词,系统软件工程师也逐渐走入大众视野。
今天,100offer 邀请到阿里系统软件技术资深技术专家吕奇(花名潇谦),围绕阿里系统软件的技术栈,来和大家聊一聊系统软件工程师的晋升之路。
2015 年底,阿里集团对外宣布启动 2018 年中台战略,构建更具创新性和灵活性的「大中台、小前台」组织机制和业务机制。其中,前台作为一线业务,更敏捷快速地适应市场;中台集合整个集团的数字运营能力、产品技术能力,强力支撑各业务前台。
那在整个阿里技术栈中,我们今天要聊的主角——系统软件事业部,到底是做什么的?承担了什么样的职责?
系统软件简单来讲是硬件和应用软件中间的协调或者连接体,帮我们把计算机上独立的硬件资源有机地管理起来,为应用软件提供服务。如今系统软件的应用范围越来越广,除了单机硬件,还包括整个集群的硬件管理。通常系统软件包括操作系统、JVM、调度系统、数据库、存储、网络和各种各样的驱动等,甚至还有游戏引擎。
从上图可以看到,其实系统软件和中间件经常会有一些交集,只不过通常我们认为系统软件更底层一些,离硬件更近一些。虽然系统软件很底层,但正是因为有它才支撑起庞大的软件产业,乃至整个互联网。
系统软件事业部在阿里还是一个比较年轻的部⻔,虽说我们在该领域已经从事多年,但原先是各个团队分离,现在有专⻔的部⻔把事情整合起来做。阿里系统软件事业部主要职责是面向阿里巴巴打造高可用、高性能、成本低的软件系统,管理阿里巴巴全球所有数据中心的服务器资源。每年双十一,系统软件都是排头兵,所有资源交付和站点建设都是由系统软件完成。
目前部⻔工作主要分为三块:操作系统与编译器(主要做 Linux 内核、性能优化)、JVM 和调度系统。
从上图可见,除了整个集团(比如大文娱、核心电商以及新零售本地生活等),蚂蚁金服、菜⻦、阿里妈妈甚至阿里云也都跑在我们的技术架构之上。系统软件部管理了百万+ 的服务器,全球最大的类 Docker 容器集群,Java 应用集群以及遍布全球的数据中心。
这里重点介绍一下我们两个比较重要的产品。第一个是 PouchContainer。
2011 年我们就做了第一代基于 cgroup 和 namespace 的轻量级容器技术,那时还没有Docker,更多是类似于虚拟机的用法,虽然它在 runtime 时已经是容器化了,所占资源非常少,但是当时我们缺少镜像化管理,在 16 年时对这个版本进行改造,兼容了社区的 Docker,把镜像的技术融合了进来。
到了 2017 年双十一,PouchContainer 支持了阿里巴巴百万级容器的规模,覆盖了所有业务。整个技术核心创新在于:
另一个产品是调度引擎 Sigma,它兼容了整个 K8SAPI,虽然在集团内使用了 Pouch 容器,但是它是兼容 OCI 标准的。这些年通过双十一大规模的验证, Sigma 远远超过了 K8S 最大支撑的五千个节点。
混部是我们这两年来在系统软件做的重要技术点,下面我将通过混部技术介绍一下阿里系统软件所涉及的知识和已有的改进。
我们的在线服务器由于需要处理峰值,并且需要做容灾,阿里巴巴是异地多活的,这意味着每一个集群挂掉了之后,另外的集群都能分摊总量,因此会有很多冗余资源产生。另一方面,大数据越来越普及,所需的计算也大大增加,成本很高。
混部就是把各种任务混合在相同的物理机上,通过调度、资源隔离等手段,在保证 SLA 的情况下,极大降低成本。
混部的场景分为在线和离线,混部根本性的要求是两种任务有优先级的互补性,在线优先级高,就像砖块,延时敏感,利用率不高,不可重跑;离线优先级低,就像水和沙子,延时不敏感,利用率高,可重跑。两者形成很好的互补。
在 2017 年双十一,混部技术就已经被大规模使用,我们做到了在平时 30% 的成本下降,2017 年有 10% 的交易流量是跑在混部集群上面的,通过在线混部离线的方式获得收益。
我们对这项技术寄予厚望,因为全球整体的利用率都很低,现在做得比较好的是 Google。未来很多社会生产都跑在服务器上,如果把混部技术加以推广运用,可以节省整个社会的成本。
可以看到整个混部集群和非混部集群的对比,混部集群提升了 30%。
离线和在线一起跑,原先不敢跑得那么高,是因为怕在线受影响,毕竟所有的内存、CPU 等资源都被离线所占用了。所以需要考察的指标就是对于在线的影响。通过我们对内核、调度、网络存储的一系列改造,可将对在线的影响控制在 5% 以内,也就是 5% 的性能影响带来 30% 的成本资源下降。
在混部里有一个比较简单的架构,之前提到的 Sigma 和 K8S 类似,都是基于容器的调度系统,另外还有基于进程的调度系统 fuxi,调度离线任务。在中间加了零层来管控 Sigma 和 fuxi 之间的资源,让两个调度器共享资源的状态。整个混部通过零层来调节各自的资源,在通过调度和内核来解决竞争和资源隔离的问题。虽然说水位控制在 40% 左右,大家感觉可能平时这个水位不满,以分钟级去看的话没有差别,但是如果以秒级甚至一个 CPU 时间片来看,它的竞争是非常剧烈的。
混部中要解决的核心问题就是资源竞争。我们认为有两个方向,调度和内核。
调度是通过资源画像和分析,在竞争之前尽可能减少竞争的发生,在竞争发生后做一些调度的补偿,是主动的,延时较高。
在内核这一层我们做了很多隔离性的东⻄,两个任务要在一起混跑,肯定会产生资源冲突,内核就在这种互补性里起作用。比如 CPU 排队时,除了 CPU share 设置一些权重之外,在线和离线同时对 CPU 争抢时,在线保有最高优先级。有了这样的技术,在线受到的影响会降到最低。
现在系统软件主要有四个方向。
第一是硬件与软件的结合。
现在 FPGA,GPU 加速,包括阿里云刚刚推出的神⻰服务器等等方式都在演进,很多时候和业务软件会直接结合。
上面这张图是神⻰服务器的架构,一种是典型的硬件结合系统软件的模式,把虚拟机跑的东⻄直接放到 mock 卡上用硬件方式来跑,让整个系统开销降到最低。另外一种是系统软件和应用软件通过定制方式结合,也能极大加速应用的性能。
第二是从单机操作系统往分布式操作系统发展,包括调度系统和分布式存储。
第三是云技术的蓬勃发展,带动了云原生技术,后者又反哺了云技术的发展。现在很多系统软件或者说分布式的系统软件都能在云原生里看到,未来系统软件在云原生上能更好体现出来。
第四是系统软件 2.0,人工智能的介入颠覆了整个系统软件。
系统软件领域正被人工智能热浪推动。阿里巴巴内部做了很多尝试,比如机器学习的全自动化容量托管,全自动化故障诊断以及基于算法的实时宿主机配置管理。我们知道在内核、硬件、参数、驱动上可以配置不同参数,对应不同的负载,在物理机上也是一样的,不同的内核参数对不同的应用和业务有很大影响。如果能有一种手段实时感知业务进程,就能实时对物理机进行参数配置,极大提升物理机的使用效率。
介绍完了系统软件领域和目前阿里在这方面的布局,我们来聊聊大家更关心的求职话题:阿里对于系统软件工程师,乃至技术方向的同学,都有哪些要求?
在我看来,阿里对员工的要求是很高的,不是你有多少能力就做多少事,而是要看你所在的这个岗位放眼全球来说,应该要为公司做到什么。我们技术上的竞争对手更多在国外,和谷歌、微软、亚马逊做较量,这要求我们必须有世界一流的水准。
阿里对知识储备当然有要求,但更多看中的是人身上的品质——乐观、聪明、皮实、自省,具备这些品质的同学才能在阿里生存下去。
除了这些阿里工程师通用的素质,这里再针对系统软件提一下三个方面的特殊要求。
一是基础知识绝对扎实。相对于一般业务,系统软件领域对算法及其他方面要求的知识点更多、更前沿。需要读大量论文,在创新时都是通过结合学术上最新的方式来落地。
二是稳定、性能和安全。我们管理所有物理机,一个小小的疏忽很可能会引发极大故障,我们保障的是整个社会的基础设施,这也是压力很大的一点。需要大家认真对待每一行代码,每次变更的所有代码都要 review;高可用,预案必须提前准备,故障不可怕,可怕的是没有恢复能力;还要注意⻛控,经得起压力考验。
三是耐得住寂寞。系统软件没有光鲜的业绩,产出效果往往要很多年,如果耐不住寂寞,很可能会陷入迷茫。系统软件基础知识要求较多,学习曲线陡峭,所以门槛较高也更相对枯燥,兴趣非常重要。同时很重要的还有英语能力,获取基础知识需要看很多国外文献,并常和国外的同学交流。
阿里对于程序员的晋升主要看重三个能力:代码、架构和运维,另外还会看创新和落地能力。
入⻔级的系统软件工程,关键词就是独立。因为系统软件很难找别人来运维,很多特性只有你自己清楚。包括独立进行发布和运维工作,独立分析和快速排查故障,独立解决问题,负责重要业务模块的需求分析和落地实现。
再往上走的关键词是深度。至少在某一领域比较精通,具有一定权威性,能进行深度产品规划并推动其往前发展,能够负责复杂度高、平台级、跨团队产品的架构以及系统设计和实现。
最后一点是广度,深度和广度兼备,就可以成为出色的系统软件工程师。广度要求有全局的技术架构设计规划、复杂问题排查总结的能力,特别是对高可用、可容灾的分布式系统的设计能力。前面的阶段更多是功能性设计,到了专家级系统软件工程师的阶段,你需要在非功能设计上做得非常出色,更具有开放性的思考,考虑到上下游业务线技术架构的影响和协同,成为行业推动者。写代码容易,但是把代码真正应用于生产,就需要技术之外的推动和领导力了。
在此,我向大家粗略推荐一些学习方式。
首先,操作系统原理一定要选一本书籍精读一下。因为系统软件很多东⻄都是在操作系统生态里做扩展,如果能精通操作系统原理,你会对硬件的架构和资源的使用有更深入的了解。
其次是数据结构和编程模型,这是系统软件里会真正实际用到的。同时要理解硬件的相关知识。其实硬件架构每年都会有新变化,对于应用程序也会提出不同的写法要求。
关于人工智能和算法,你可以不懂具体算法,但是需要有算法意识,理解 AI 原理,在工作中有助于打开思路。
最后一点,现在开源项目较多,云原生也处于高速发展的阶段,如果你有志于做系统软件工程师,可以积极参与这些社区的生态建设。
想知道阿里系统软件部这个「神秘组织」的团队架构以及分工?想了解混部的重要技术细节和存储问题?想看潇谦如何解答程序员网友的刁钻提问?点击这里查看由「链接」阿里系统软件工程师的自我修养 - 知乎 Live,解锁更多干货!
来100offer求职,实现一名优秀工程师的自我修养