目录 封面故事 我们这群90后,正在字节跳动“死磕”Linux内核i 重磅访谈 云与AI时代,金山办公再挖“金山”1 工商银行十年磨砺:建成同业最大规模云计算平台, 既要开源又得可控15 六年经历三次架构迭代,OceanBase单机分布式一体化会是 大势所趋吗?28 后Hadoop时代,字节跳动如何打造云原生计算平台39 “羊了个羊”背后的国产3D引擎Cocos:这绝不是团队最高光 的时刻52 封面故事 我们这群90后,正在字节跳动“死磕”Linux内核 嘉宾:张宇、段熊春、宋牧春、谢永吉、邓良作者:凌敏 随着互联网的快速更迭,许多明星产品在时代的光环下熠熠生辉;但在喧闹的背后,有这样的一个群体,默默的守护着互联网世界的平稳,今天我们就来介绍这样一群幕后守护者。 2012-2022,是字节跳动产品线快速延伸的十年,也是基础设施规模快速增长的十年。在这背后,有这样一支团队默默为字节上层业务的稳定保驾护航,他们就是字节系统部STE团队。 早在2015年,STE团队就初具雏形,当时主要是问题驱动,为字节内部基础设施及软件系统提供技术支持。随着2017年抖音等热门产品用户量级大爆发、成为现象级APP,字节内部的服务器规模愈发庞大,对系统的维护工作也成为重中之重。 2018年,团队被正式命名为STE(全称:SystemTechnologies&Engineering,系统技术与工程)。如今,STE团队已从最初的20人扩大至数百人规模,在英国、美国等多地设有研发中心。技术维度也从操作系统内核扩展到服务器固件、编译器技术、系统虚拟化、主机网络、系统智能运维等基础技术,并将基础软件工程能力赋能业务。 在本期访谈中,InfoQ有幸采访到了STE内核方向的多位核心成员,了解他们在 Linux内核优化上的技术实践与经验,以及这些工作为业务带来的价值,同时一窥这支专注于底层基础设施建设、在“看不见的地方”用技术构筑城墙的团队的精神和文化。 专注Linux内核的90后团队 据了解,STE内核团队是字节系统部面向公司内部所有业务提供Linux内核服务的团队,主要负责内核管理、进程调度、虚拟化和网络等几个方面的工作。据STE内核团队负责人段熊春介绍,在2015年STE团队初具雏形的时候,就有研发人员负责内核相关的工作。2018年,STE团队正式成立,内核方向也作为其下属团队之一,逐步扩建成有专职研发人员负责解决Linux内核存在的问题,并增加和维护新特性。 我们注意到,这是一支非常年轻的团队,内核维护者以90后居多,这其实并不常见。毕竟“Linux之父”LinusTorvalds曾感慨,“目前的维护者多是50、60后,社区面临代际更新问题。”LinusTorvalds甚至担心,在他们这批Linux内核维护者老去之后,很难再找到新的继任者,因为很多年轻开发者认为“Linux内核项目并不那么有趣”。 STE团队的负责人张宇深耕于系统技术领域多年,对此他也表示,“现在专注在底层基础软件、操作系统内核上的人才越来越匮乏,甚至出现了两种极端:一种是开发者的计算机基础非常扎实,底子好,但对内核研发并不感兴趣;一种是对内核非常感兴趣,但底子薄,需要补功课。同时具备这两方面优势的人才非常少。对于我们内核团队而言,年轻是我们的优势,正是这种对内核技术的痴迷和热爱,才让我们走到了一起。” 向团队中注入新鲜的血液并不难,难的是如何让这些年轻人在Linux内核方向愈战愈 勇、愈走愈远。对此,张宇提到了两个字:激发。给年轻人平台,激发其兴趣;给年轻人机会,激发其斗志。“我们也有很多资深的开发者,但他们更倾向于把好的机会留给年轻人。这种‘传帮带’的传统,能够让年轻开发者有机会站到台前,越做越有信心。否则,如果年轻人持续得不到鼓励、不被激发,在这条艰辛的道路上就很难做出成绩、走得长远。”张宇提到。 正是在这种文化氛围的熏陶下,STE内核团队依托于Linux内核,在虚拟化、云原生、eBPF等技术方向都有非常硬核的输出。比如,2020年9月,团队向Linux内核社区贡献了HVO方案,该方案能够解决Linux内核内存管理冗余这一难题。 困扰业内数十年的Linux内核内存管理冗余,有了解法 从LinusTorvalds在1991年发布第一版开始,Linux内核迄今已发展了30余年。据称,第一版的Linux内核只有10250行代码,占用65KB,而如今,Linux内核代码行数早已超过2700万。 Linux内核每年新增/删除的代码多达百万行,也加入了越来越多优秀的特性。这样一个复杂且臃肿的工程,在不同的业务场景下,势必会面临各式各样的挑战。 支撑字节全量服务器运转的正是Linux操作系统。STE内核团队发现,一些云计算的场景会带来额外的内存管理开销,随着服务器规模越来越大,这种损耗也会成倍放大。 “Linux内核以页(一般4KB)为单位管理物理内存。每个4KB页对应一个struct page结构体。使用一个structpage管理一个页,这本身没什么问题。但是当使用的页的大小是2MB甚至1GB时,Linux依然以4KB为单位分配structpage,这显然是个内存浪费的行为。我的目的就是尽可能减少这部分冗余的内存管理开销。”说这话的是STE工程师宋牧春。2019年7月,宋牧春加入字节STE内核团队,三年时间,宋牧春随团队一同成长,也完成了从Linux内核开发者到Linux内核维护者的转变,并成为Linux内核社区HugeTLB和MemoryCgroup两个核心子模块的maintainer。 实际上,Linux内核内存管理冗余并不是一个新问题,它在业内已存在十年之久。过去不少公司都做过研究,但始终没有找到解法。即便如此,STE内核团队依然想做一些尝试。在不断地讨论、验证各种方案的可行性后,团队发现这个问题是有可能被解决的。 “某些场景会使用到大页,每个大页需要8个页的structpage去管理,即8X4K的内存,我们希望最终只占用一个页的物理内存(4KB)。对此,我们想的方案是复用,把后面7个虚拟地址映射到唯一的物理页,如果方案能成功落地,则意味着1T的服务器,最大能节省接近16GB的内存。即使优化1%,整体给公司带来的收益也会非常大。”宋牧春说道。 这套方案被称作HVO(HugeTLBVmemmapOptimization)。方案有了,下一步就是做代码调研。 Linux内核管理是非常复杂且核心的一个模块,它和各个模块交织在一起,它的稳定性也必然会影响整个Linux内核的稳定性。因此,STE内核团队需要尽可能地减少该方案代码涉及的范围,并确保不会影响系统里的其他功能。为此,从2020年4月到 2021年6月,团队开始了长达一年时间的代码调研、开发、测试和重构。用一年的时间,解决一个技术难题,值得吗?段熊春给出了肯定的回答。 “我们会衡量这件事情的价值,显然我们也面临着很多压力,但真正难的事情是需要投入更多时间去看的,我们也需要这样做。基于对技术的狂热,我们周末也经常聚在一起讨论和思考,再把这些想法带到实际场景中,更好的打磨和优化。这是一个长期的过程,而这些突破也能为公司和业界带来巨大的收入,这就是有价值的。” 同时,HVO也得到了业界的广泛认可:华为、Google、AWS、甲骨文都准备将这个方案投入使用,还有公司向团队发来感谢信。“但这不是终点,我们会持续优化HVO方案。”段熊春说道。 Linux内核云原生技术新探索 设备虚拟化技术作为云计算领域最重要的基础技术之一,多年来一直在稳步向前演进。其中,virtio和VFIO在过去一直是最主流的设备虚拟化技术,并分别于2008年、2012年被合入Linux内核主线。为了将virtio和VFIO的优势结合,2020年,vDPA (VirtioDataPathAcceleration)技术框架被合入Linux内核主线。与此同时,字节内部的云原生化进程也在进行着。 据了解,字节最早于2016年开始在内部推进云原生化进程,对业务进行大规模容器化改造。到2021年年末,字节已经有超过95%的应用实现了云原生化。在这个过程中,STE内核团队发现,容器在一些I/O相关的解决方案中,与传统的虚拟化方案相 比比较受限。“我们当时希望能够在Linux内核中提供一套框架,开发者可以基于这个框架去模拟各种各样的设备,并且能够直接供容器接入使用。这样,就进一步弥补了基于容器的云原生方案在I/O方面的短板,甚至还能够和相对成熟的虚拟化方案实现一定程度上的技术复用。”STE工程师谢永吉对InfoQ说道。 于是,VDUSE框架应运而生。通过VDUSE,开发者可以在一个用户进程中实现一个软件定义的vDPA设备,并可以通过vDPA框架接入virtio或者vhost子系统,供容器或者虚机使用。 根据介绍,具体的实现原理上,VDUSE设备是由/dev/vduse/control的ioctl(VDUSE_CREATE_DEV)创建的,通过这个ioctl,用户空间可以为这个模拟设备指定一些基本配置,如设备名称(唯一标识VDUSE设备)、virtio特性、virtio配置空间、virtqueues数量等等。然后,一个字符设备接口(/dev/vduse/$NAME)会 被导出到用户空间用于设备模拟。用户空间可以在/dev/vduse/$NAME上使用VDUSE_VQ_SETUPioctl来初始化每个virtqueue的配置,如virtqueue的最大长度等。 在初始化之后,VDUSE设备可以通过VDPA_CMD_DEV_NEW这条netlink消息绑定到vDPA总线。之后,用户空间可以在/dev/vduse/$NAME上通过read()/write()来接收并回复来自VDUSE内核模块的一些控制请求,同时还可以通过mmap()映射一段共享内存,与内核相应的virtio驱动进行数据通信。 2020年10月,STE内核团队向Linux内核社区正式开源VDUSE。经过一年时间,VDUSE在Linux5.15版本被正式合入。 “在计算存储分离的架构下,我们可以在计算节点通过VDUSE框架模拟各类存储设备供容器或虚机使用,这类存储设备的后端往往是远端的存储节点。现在,这套解决方案在字节的云原生场景已经开始大规模部署。后续,我们也将继续探索在云原生高性能网络场景上的应用可行性。”谢永吉说道。 Linux内核始终在向前演进,在STE工程师邓良看来,“随着云原生应用场景不断扩大、硬件朝着高密度应用异构的机型上发展,对Linux内核提出了新的要求。内核是连接底层硬件和上层云原生应用的一个桥梁,我们也在思考,当前这种单一的宏内核是否合适,并且我们也在做一些探索。” 拥抱社区,让技术产出更大的收益和价值 如果说攻克技术难关靠的是技术硬实力,那么向社区推广并使其合入我们的代码,则要依靠足够多的耐心去沟通和布道。 在与社区沟通上,STE内核团队也积累了自己的经验。 2020年9月,当HVO第一个版本发到社区后,团队收到很多质疑的声音。“社区起初对我们的方案产生怀疑,我们需要先向社区证明这个方案没有问题。同时,社区也会提出一些针对性的问题,甚至有很多都是我们之前没有考虑过的场景。根据这些问题,我们再对方案进行迭代和维护。像HVO,我们迭代了20多个版本,需要不断地向社区证明这个方案在不同场景的有效性,这个过程持续了很长的时间。”回忆HVO的社区之路,宋牧春觉得特别漫长。在他看来,社区需要考虑维护成本是否大于收益,这无可厚非,作为开发者和社区贡献者,要做的就是解释清楚技术方案能够产生的价值,让社区看到它带来的收益,并证明这个方案的可行性和稳定性。 在企业内部,一套技术方案从开发到应用,这个链路并不复杂。但面向社区,开发人员需要考虑的问题就会更多。“很多时候,我们要突破自有场景,去看社区里的其他场景和痛点,而这些很可能是我们从来没有遇到过的。”显然,拥抱社区的沟通成本会很高,但在段熊春看来