嘉宾|张宇、段熊春、宋牧春、谢永吉、邓良
作者|凌敏
随着互联网的快速变迁,许多名星产品在时代的光环下熠熠生辉;但在嘈杂的背后,有这样的一个群体,默默的守护着互联网世界的平稳,明天我们就来介绍这样一群幕后守护者。
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页对应一个structpage结构体。使用一个structpage管理一个页,这本身没哪些问题。并且当使用的页的大小是2MB甚至1GB时,Linux仍然以4KB为单位分配structpage,这似乎是个显存浪费的行为。我的目的就是尽可能降低这部份冗余的显存管理开支。”说这话的是STE工程师宋牧春。2019年7月,宋牧春加入字节STE内核团队,两年时间,宋牧春随团队一齐成长,也完成了从Linux内核开发者到Linux内核维护者的转变,并成为Linux内核社区HugeTLB和MemoryCgroup两个核心子模块的maintainer。
实际上,Linux内核显存管理冗余并不是一个新问题,它在业内已存在六年之久。过去不少公司都做过研究redhat 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说道。
于是linux内核 中国,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的社区之路,宋牧春认为非常漫长。在他看来,社区须要考虑维护成本是否小于利润,这无可厚非,作为开发者和社区贡献者,要做的就是解释清楚技术方案才能形成的价值,让社区看见它带来的利润,并证明这个方案的可行性和稳定性。
在企业内部,一套技术方案从开发到应用,这个链路并不复杂。但面向社区,开发人员须要考虑的问题都会更多。“很多时侯,我们要突破自有场景linux串口驱动,去看社区里的其他场景和痛点,而那些很可能是我们从来没有碰到过的。”显然linux内核 中国,拥抱社区的沟通成本会很高,但在段熊春看来,为社区贡献代码才能实现多赢,这都是值得的。
“现在我们的工作环境基本是模拟社区环境,工作模式也跟社区保持一致。这些标准化的作业模式能有效减少代码的维护成本,同时社区思维的宽广性,也为我们思索问题提供了更多的思路,从而为技术创造价值提供了更多的可能性。”
走入“无人区”
对于STE内核团队的愿景和目标,张宇用了三个“贴近”来描述:紧贴业务,去了解业务的痛点;紧贴社区,去了解社区的方向;紧贴新硬件技术,在软硬协同设计上发挥内核更大价值。内核本身难以直接创造价值,更多是通过服务业务来创造价值。所以团队在做研制时,一定要想清楚对业务的收益是哪些,它能够真正的解决业务痛点,从而创造业务价值。
STE内核团队多年来仍然深入社区。基于开源Linux操作系统,团队做了一些优化以满足企业内部的需求,反之,团队也会把这种好的特点回馈给社区,像前文提及的HVO和VDUSE都已被合入Linux内核主线。在张宇看来,STE内核团队并不是要做一个标新立异的操作系统,更多的是源自技术初心,希望才能把自身的力量贡献给社区,交给Linux,再不断引进。
张宇表示,STE团队特别注重“务实”,这也是字节的核心价值观之一。“我们在做的事情都是围绕基础设施展开的,增强它的稳定性、优化性能等等,与公司内其他能直接创造利润的名星产品相比,我们是一个做加法的部门,通过技术手段增加基础设施成本,在业务链路里属于十分靠后的位置,如同足球场上的球员一样,要能固守系统稳定性/可靠性的基本盘不出问题,又要才能往左路抢断入球。回到团队的愿景来看,我的看法比较简单务实,希望团队先满足业务的需求,再低于业务需求、先于业务需求,做一些推动业界的技术。如同一开始,我们是跟随社区,跟随业界领先者的路径去走,但随着我们技术能力不断提高以满足业务场景多样性的需求,再向前走,必定步入‘无人区’。”
步入“无人区”后,没有方向的指引,也没有参照物,这才是最考验团队能力和硬度的时侯。“我希望团队有开拓精神,识别出合理的方向并坚定的走下去,恐怕在过程中会有微调,但最后顶多画下来的路线是波浪线,而不是一条完全没有目标的曲线。”张宇说道。
写在最后
直至明天,团队对HVO的优化还在继续。2022年3月,团队优化了HVO在2MBHugeTLB的表现,与此前相比,它进一步将2MBHugeTLB的structpage开支减轻了12.5%;2022年4月,HVO支持ARM64构架;2022年5月,HVO支持运行时开关,不再禁锢于cmdline的形式使能。
依托Linux内核,团队在虚拟化、云原生、eBPF等技术方向上也在继续探求着。
“现在我们关注的比较多的场景,一个是云原生,这也是你们都在关注的方向,但当前并没有一个非常好的解决方案,甚至在云游戏的一些基础设施场景下,业界还没有产生一个标准;另一个就是软硬协同,用软件的形式定义硬件,用硬件的方法来定义软件。目前我们也围绕这种方向在做一些研究。”张宇觉得,“如果团队仍然在做一些重复的事情,是没有激情与战斗力的,对团队的期盼还是要在满足业务需求之上,去做一些推动业界的事情。”
在张宇看来,做操作系统这类基础软件不是一时热情,是须要常年投入的。大浪淘沙沙去尽,沙尽之时见真金。“目前国外外大厂也都在围绕自己的业务场景做软硬一体的事情,涉及基础系统软件、芯片板卡服务器之类的硬件研制。在做的同时也要上升到社会责任感的层面上来看,能贡献多少力量。这种都是须要持续思索的。”
嘉宾介绍:
张宇,字节跳动STE团队负责人
段熊春,字节跳动STE内核团队负责人
宋牧春,字节跳动STE工程师、Linux内核社区HugeTLB和MemoryCgroup两个核心子模块的maintainer
谢永吉,字节跳动STE工程师
邓良,字节跳动STE工程师