openEuler,未来可期 - 2021 年北京工业大学大师讲坛演讲稿

大家好,我是马全一,目前在华为技术有限公司工作,任开源社区运营总监,主要负责 openEuler 操作系统的开源社区运营,同时也负责 openGauss 、openLooKeng 两个开源项目的运营指导。2000 年参加工作后一直从事技术开发和技术管理等工作;2013 年开始在国内运营 Docker 社区,推广容器、Kubernetes 等云原生技术;2015 年加入华为负责 CNCF 等海外基金会的一些工作,维护华为和谷歌、红帽等云原生领域核心企业的开发者关系,同时也参与了华为云容器相关产品的设计和开发;2017 年底离开华为加入腾讯,负责腾讯云容器产品的设计,领导了腾讯的开源项目 TKEStack ,这个项目也捐赠到开放原子开源基金会;2020 年初回到华为负责 openEuler 操作系统开源社区相关的运营工作。因为工作的原因,这两年也致力于同一些高校操作系统课程的老师合作进行计算机教学改革的探索。

参与 openEuler 让我有机会重回学校,这个机会对我来说是非常宝贵的。我在大学期间学习的是师范类生物教育专业,对计算机相关学科的教学体系并不了解,经过一段时间的摸索后让我对操作系统课程的教学情况有了一些认知,但是也带来了一些疑惑。今天不是来给大家讲操作系统的高深知识,这部分我相信学校的任课教授一定会比我讲的更好更精彩,我今天来是把当前业界操作系统发展的趋势,一些当前操作系统设计背后的理念,以及我对这个行业、包括基础软件未来发展的个人判断带给大家。希望给今天参与这个讲座的学生带来操作系统这些基础软件未来发展方向的一些参考意见,盼望你们在将来择业或者选择学术方向时有一些参考。


最近我在读《高效写作》这本书,其中有段话是这样说的

在学生时代,我们就学会了如何掩盖自己的无知。我们知道如何用长篇累牍来填补自己不知道的东西,也会在游移不定处故作坚定。所以,迷失感确实表明自己力有不逮(dài),不确定能否言之有物。

当我这两年和很多高校的操作系统老师一起探讨教学改革时,发现不止是我自己,很多高校的教授和学者也迷失在这快速变革的时代中,无从坚持操作系统课程的初心。 当前大学教授、助教都是有很大的科研压力、论文压力、项目压力和生活压力。生活在这种高成本的社会,需要获取丰厚的收入支撑家庭,还要兼顾工作和科研,每天都沉浸焦虑之中。在这个过程中,每个人都会自然的选择更容易出成果的科研技术方向投入,这也是无可厚非的。这就造成了最近十年大部分科研方向都转向了 AI 领域 ,甚至一些非计算机相关专业的科研方向也都在向 AI 靠拢。各种相关顶级会议和期刊上,来自中国的论文和研究也越来越多。这一改变这也就牵引了我们的研究生、本科生在学习的过程中偏向于这个方向。

不可否认,最近几年应届生高薪的 Offer 也都出在了 AI 这个领域。但是随着 AI 发展,落地场景局限性的问题逐渐显露出来,AI 方向 Offer 数量已经急剧减少,争夺国内几家公司的 AI Offer 就像千军万马争过独木桥一样。我之前在腾讯有参与过实习生、应届生的招聘工作,其中我所在组一名北京交通大学的实习生转正后,我有咨询他具体情况。据他所讲,他所在寝室 4 个人,只有他一个人是搞 Kubernetes 的这样基础软件并且拿到了腾讯的 Offer ,其它 3 个学 AI 室友的都没有拿到 Offer ,最终选择去考公务员或者去银行之类的。当然现在考公务员、从政也是一股潮流,也不能说他们的选择不好。只是市场的调节有时候是滞后的,大家在选择方向时一定要谨慎,也听说教育部也有发文在纠正这个科研和教学方向的发展。


那我们返回来讲操作系统是不是有 “钱途”,操作系统的发展是什么样子的,我们到底应该怎么选择呢。首先我们看操作系统是干什么用的,我的观点是操作系统是一个“中间件”,是计算机硬件和应用之间沟通的桥梁,当然操作系统也做了内存管理、进程管理等复杂的事情,但这些功能的核心诉求是让应用更好的使用硬件。

譬如说操作系统的内存管理这些年的演进,就是让应用程序能够使用更大的内存,更高效的使用内存。Linux 系统的交换分区,就是在内存比较昂贵、比较小的年代,划分一部分硬盘空间作为在系统内存不够时使用的,但是近年来按照 Linux 时就不再设置交换分区了,主要是因为现在的服务器内存很大,基本不太出现内存不够用的状况了。在 openEuler 最新的版本发布了一个内存分级扩展的功能,为什么要这样做这样的功能呢?之前配置服务器的时候按照 1 个 CPU 核配 2 G 内存、后来发展到 4G、8G,16G 甚至更大,为的是数据库、虚拟机、大数据、人工智能、深度学习这些场景中需要巨大算力的同时,满足内存的支持。譬如 AI 场景我们就经常需要把大量的数据读入内存或者 GPU 的显存进行计算。所以内存容量成为了制约业务和算力的问题。那么内存分级扩展通过机器本身的高速内存和低速内存介质混合在一起形成多级内存,譬如 RDMA 这种远端的内存就属于低速内存。通过内存自动调度让热数据在高速内存区中运行,让冷数据交换到低速内存区,从而增加内存容量,保证核心业务高效平稳运行。这种方式适用于内存使用量大,且使用相对不频繁的应用进程上,如 MySQL 、Nginx 等。

前面讲我们配置机器的内存是根据计算机的核数来的,要为什么要这样配置呢,CPU 和内存的之间的关系对计算机的性能有什么影响呢?我们知道 CPU 都是有多级缓存的,缓存的速度要比内存快,如果一个计算任务需要的内存数据能够绑定在一个核上计算时,它使用的数据都在固定的内存和缓存上,节省了在核之间调度计算任务,数据在不同的缓存和内存区域进行交换的时间,从而提升了整个的计算效率。那么这里逻辑是什么呢,就是用空间换时间,在一些优化策略里面是时间换空间策略,可以让任务跑的慢一点没关系,但是要保证任务能够完成,前面我们说的设置内存交换空间就是这样的策略。所以我们从操作系统领域到其它的软件的性能调优,其实也都大多是利用这个原则(“时间换空间或空间换时间”)。所以我们在工作的时候经常说,如果脱离开场景,谈性能优化都是刷流氓。硬件规格是固定的,它的计算能力是固定的,不会因为任何调优而凭空产生更多的算力。华为很多针对鲲鹏服务器的在内核层面的调优,在根本上也是基于这个原则,利用了 ARM 上核数多的优势,再加上内存绑定这类技巧,实现在单机的性能上超越 x86 架构的服务器。在我看来,这是由于 x86 的制造工业和发展方向这几年没有什么突破,牙膏厂这几年有些没落的趋势。这部分的内容在 openEuler 操作系统这本书都有,我们最近也在整理相关的内容和实验,把这部分开源在 openEuler 社区。

我们再讲讲 openEuler 做点其它内存方面的优化,在 gcc 和 jdk 方面都做了内存对齐优化。在我们的系统中,CPU 从一个时钟周期读取的内存单元 4 bytes 是连续的,所以编译器在分配数据的时候如果能把数据放到 4 bytes 内,或者连续的 4 bytes 倍数的内存中,CPU 读取的效率也就提高了。

我们看到了这些操作系统以及周边工作的优化都是为了在提升硬件效率,所以我会把操作系统看做中间件,这个中间件就是将硬件经过优化提供给应用程序。

我这里举例的 openEuler 是华为内部使用了近 10 年的操作系统,在 2019 年 12 月 31 日正式宣布开源。openEuler 的包格式选择的是 rpm ,这个是 RedHat 、SUSE 等操作系统普遍选择的包格式,但是打包的规范,openEuler 有自己做了重新的定义,规范上不同于 Fedora ,是独立体系的包格式。当然 openEuler 的内核和其它 Linux 发行版一样是使用的 Linux Kernel ,所有的软件包也是来源于 Linux 上游社区,所有的内核版本选择、软件包版本选择、发布周期等等都有自己独立的规范和规定。按照 Linux 操作系统的约定俗称,openEuler 属于一个 Linux 发行版,和 Fedora、OpenSUSE、Debian、Ubuntu 一样的发型版。如果基于 CentOS 来做的发型版,使用了 CentOS 的内核版本,使用了 CentOS 的包定义,即使是自己重新编译,也不能称之为 Linux 发行版,我们一般称呼这样的发行版位为 CentOS 的衍生版。

当然目前国内的大型企业和云计算厂商使用的是 CentOS 或者自己制作的衍生版本,这个现象产生是有原因的,并不是说 CentOS 就一定有多好。CentOS 是根据 RedHat 企业版的 Linux 内核版本以及包版本编译的社区版本,我们可以把它看作是 RedHat 企业版的克隆。在国内 IT 发展的早期,大家并不是所有的服务器操作系统都购买 RedHat 企业版,只是少部分购买,大部分用 CentOS 这种克隆版本。当出现 CVE 按照漏洞或者内核升级的时候,利用少量购买的 License ,就可以获取到 RedHat 的更新和技术支持,而这些正好是可以用在 CentOS 的克隆版本上的,这样就慢慢形成了国内普遍使用 CentOS 作为服务器的版本。现在随着国内越来越重视版权,这样的行为基本不可见了,绝大部分厂商都购买各种各样的正版操作系统。


Linux 操作系统从出现到现在有 30 年的时间,未来它的发展是怎么样的呢,有什么新的技术会影响它的发展,我们如何选择它的方向学习呢?

首先是近几年出现了新的编程语言 Rust ,正在被开发者接受,而且 Linux 内核也是第一次接受 C 语言之外的开发语言,这个对 Linux 内核的发展产生了重大的影响。Rust 相比其它编程语言最大改进是从语言的机制实现了内存安全。自从 2004 年开始,微软安全相应中心(Microsoft Security Response Centre, MSRC) 对每个报告的安全漏洞进行分类。MSRC 的 Matter Miller 在 BlueHat IL 2019 年的会议中公布 70% 的漏洞都和内存安全 (Memory Safety) 相关。虽然 C++ 使用智能指针能避免部分内存安全的问题,但是 C++ 依旧没有完全避免内存安全和数据竞争的问题。依靠开发者做 “正确的事情” 依旧是无法避免内存安全问题。Google 在其漏洞奖励计划 (Vulnerability Rewards Program,VRP) 的统计数据中,内存带来的漏洞占统计数据的 59% ,是占比第一的,同样的 Apple 在其安全报告中也是列举了大量内存相关的漏洞,这也是 Rust 语言产生的重要原因之一。可以看到 Rust 语言引入到 Linux 内核开发中,必将吸引大量的开发者参与,Linux 内核开发生态也将迎来井喷发展。

我们知道 Linux Kernel 是宏内核,随着功能的不断叠加,当前已经成为非常庞大的体系。宏内核在保证效率的同时,也带来了一些开发和安全上的问题。安全上随着功能增加,暴露出来的攻击面也就越大,系统也就越脆弱。之前我在一些公司工作的时候,都是根据服务器的硬件和要在服务器上运行的程序来定制内核,内核通常不大,基本在 4M 左右。当然这些年很少有企业来这样做了,也少有运维工程师有能力根据业务情况定制内核了。在开发层面,由于 Linux Kernel 的庞大体系致使调试非常困难,这个状况也使得社区发布了一些项目来帮助内核开发着,这里面堪称内核调试瑞士军刀的项目就是 ebpf 。ebpf 是从 bpf 也就是 Berkely Packet Filter 发展演进而来的,e 的意思是 Extended ,原先的 bpf 则成为 Classic Berkely Packet Filter 。3.18 版本以后的内核都带有 ePBF 解释器和 JIT 编译器,使得内核能够在运行过程中执行字节码的指令,能够在内核运行过程中输出内核的一些状态。我们可以简单点的理解,它是内核运行过程中的一个虚拟机,你可以在虚拟机中执行一些指令。利用 epbf 可以实现在网卡驱动和内核协议栈之间插入了eBPF扩展的网包过滤、转发功能,这个也就是我们讲的 XDP 功能,这部分中 openEuler 21.09 版本中也是支持的。

从这几年云计算的发展,引入当前操作系统功能模块实现的一个潮流,就是所谓的计算下沉。简单点解释就是之前在内核中做的一部分工作,都在计算机不同的部件中直接完成,而不经过内核,由他们分担一部分内核功能,从而提升效率和速度,我们经常听到到 DPDK 就是这种潮流的代表。为了加速网络传输的速度,讲对网络数据的解包封包和转发,直接在网卡中进行,网卡承担了很多内核做的功能。随着 RISC-V 的逐渐兴起,设计各种各样的计算卡已经成为一种潮流,在未来的服务器中,我们一定会看到多种多样架构的各种硬件参杂在一起。我之前在腾讯内部推广一个理念就是多维异构,意思是软件和硬件都是异构的。软件不管是容器、KVM、rust-vmm 这种底层技术带来的上层 Kubernetes 编排能力增强,会把计算业务、大数据、AI 等混合调度在一个集群中;底层 RISC-V 、ARM64 和 X86 混合在一起形成服务器集群,发挥各自的长处服务于业务。openEuler 虽然生于华为,但是推出的时候就支持 X86 和 ARM64 两种架构,当前我们正在和中国科学院软件研究所的专家们一起向 RISC-V 移植,目标就是支持各种厂商的芯片,支持各种架构,为上层业务提供性能、稳定性和安全的保障。


中国科学院软件研究所一直是 openEuler 社区中重要成员之一,openEuler 社区在去年和今年都举办了暑期高校学生的竞赛活动 暑期 2020 和暑期 2021 ,在这两年的活动中有近千名学生参与到开源社区的开发中,在这里不仅仅是 openEuler 社区,更有 100 多个其它开源社区参与进来。在这些活动中,参与的学生有机会和各个公司顶尖的工程师一起工作,学习到新的技能,了解开源社区和参与社区。当然竞赛活动是有选拔的,在众多的报名者中只有少数的学生有机会参与到这个活动中。考虑到这个情况,openEuler 社区也会中近期和中科院软件所发起新的开源社区活动就是 openEuler 开源社区实习。每个学生都可以报名参与 openEuler 开源社区的实习,经过学生资格的认证后,可以在 openEuler 社区选择相关的任务,不同难度和工作量的任务会有不同的积分,在一定时间内当学生完成的一定积分的任务后,由中国科学院软件研究所为学生开具实习证明,同时有一定金额的实习奖金。我们也正在和一些学校进行积极的沟通,目前已经有一些学校认可这个活动的实习证明,可以用来申请实习学分。这个活动的门槛就会低很多,任何学生都可以报名参与,优秀的学生我相信在明年的 暑期 2022 活动中,更容易中选参与更高级别的竞赛活动。实习活动应该在本月发布,希望大家关注 openEuler 公众号、头条号,获取活动报名的最新信息。


openEuler 开源社区从始至终都是一个开放的社区,目前有很多国内外的操作系统厂商、硬件厂商、中间件厂商和独立的开发者参与。社区有理事会、技术委员会、各个技术方向 SIG 组等完善的社区组织架构。就在这个月,我们也正式加入了国内唯一的开源基金会 - 开放原子开源基金会,openEuler 的治理和管理都将在基金会和政府的指导下更加规范和开放。目前除中国科学院软件研究所以外还有大连理工大学、兰州大学等大学也参与到社区中,利用 openEuler 开源社区这个平台,为高校计算机教育打造一个学习和科研的平台。

希望大家能更多的关注操作系统、数据库这些基础软件,希望能够有更多的高校师生参与到开源社区,希望能为大家将来的择业和科研提供更多的帮助。