【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

我们这群 90 后,正在字节跳动“死磕”Linux 内核 | 卓越技术团队访谈录

  • 2022-11-18
    北京
  • 本文字数:5847 字

    阅读完需:约 19 分钟

我们这群90后,正在字节跳动“死磕”Linux内核 | 卓越技术团队访谈录

嘉宾 | 张宇、段熊春、宋牧春、谢永吉、邓良

作者 | 凌敏


随着互联网的快速更迭,许多明星产品在时代的光环下熠熠生辉;但在喧闹的背后,有这样的一个群体,默默的守护着互联网世界的平稳,今天我们就来介绍这样一群幕后守护者。


2012 - 2022,是字节跳动产品线快速延伸的十年,也是基础设施规模快速增长的十年。在这背后,有这样一支团队默默为字节上层业务的稳定保驾护航,他们就是字节系统部 STE 团队。


早在 2015 年,STE 团队就初具雏形,当时主要是问题驱动,为字节内部基础设施及软件系统提供技术支持。随着 2017 年抖音等热门产品用户量级大爆发、成为现象级 APP,字节内部的服务器规模愈发庞大,对系统的维护工作也成为重中之重。


2018 年,团队被正式命名为 STE(全称:System Technologies & Engineering,系统技术与工程)。如今,STE 团队已从最初的 20 人扩大至数百人规模,在英国、美国等多地设有研发中心。技术维度也从操作系统内核扩展到服务器固件、编译器技术、系统虚拟化、主机网络、系统智能运维等基础技术,并将基础软件工程能力赋能业务。


在本期访谈中,InfoQ 有幸采访到了 STE 内核方向的多位核心成员,了解他们在 Linux 内核优化上的技术实践与经验,以及这些工作为业务带来的价值,同时一窥这支专注于底层基础设施建设、在“看不见的地方”用技术构筑城墙的团队的精神和文化。

专注 Linux 内核的 90 后团队


据了解,STE 内核团队是字节系统部面向公司内部所有业务提供 Linux 内核服务的团队,主要负责内核管理、进程调度、虚拟化和网络等几个方面的工作。据 STE 内核团队负责人段熊春介绍,在 2015 年 STE 团队初具雏形的时候,就有研发人员负责内核相关的工作。2018 年,STE 团队正式成立,内核方向也作为其下属团队之一,逐步扩建成有专职研发人员负责解决 Linux 内核存在的问题,并增加和维护新特性。


我们注意到,这是一支非常年轻的团队,内核维护者以 90 后居多,这其实并不常见。毕竟 “Linux 之父”Linus Torvalds 曾感慨,“目前的维护者多是 50、60 后,社区面临代际更新问题。”Linus Torvalds 甚至担心,在他们这批 Linux 内核维护者老去之后,很难再找到新的继任者,因为很多年轻开发者认为“Linux 内核项目并不那么有趣”。


STE 团队的负责人张宇深耕于系统技术领域多年,对此他也表示,“现在专注在底层基础软件、操作系统内核上的人才越来越匮乏,甚至出现了两种极端:一种是开发者的计算机基础非常扎实,底子好,但对内核研发并不感兴趣;一种是对内核非常感兴趣,但底子薄,需要补功课。同时具备这两方面优势的人才非常少。对于我们内核团队而言,年轻是我们的优势,正是这种对内核技术的痴迷和热爱,才让我们走到了一起。”


向团队中注入新鲜的血液并不难,难的是如何让这些年轻人在 Linux 内核方向愈战愈勇、愈走愈远。对此,张宇提到了两个字:激发。给年轻人平台,激发其兴趣;给年轻人机会,激发其斗志。“我们也有很多资深的开发者,但他们更倾向于把好的机会留给年轻人。这种‘传帮带’的传统,能够让年轻开发者有机会站到台前,越做越有信心。否则,如果年轻人持续得不到鼓励、不被激发,在这条艰辛的道路上就很难做出成绩、走得长远。”张宇提到。


正是在这种文化氛围的熏陶下,STE 内核团队依托于 Linux 内核,在虚拟化、云原生、eBPF 等技术方向都有非常硬核的输出。比如,2020 年 9 月,团队向 Linux 内核社区贡献了 HVO 方案,该方案能够解决 Linux 内核内存管理冗余这一难题。

困扰业内数十年的 Linux 内核内存管理冗余,有了解法


从 Linus Torvalds 在 1991 年发布第一版开始,Linux 内核迄今已发展了 30 余年。据称,第一版的 Linux 内核只有 10250 行代码,占用 65 KB,而如今,Linux 内核代码行数早已超过 2700 万。


Linux 内核每年新增 / 删除的代码多达百万行,也加入了越来越多优秀的特性。这样一个复杂且臃肿的工程,在不同的业务场景下,势必会面临各式各样的挑战。


支撑字节全量服务器运转的正是 Linux 操作系统。STE 内核团队发现,一些云计算的场景会带来额外的内存管理开销,随着服务器规模越来越大,这种损耗也会成倍放大。


“Linux 内核以页(一般 4 KB)为单位管理物理内存。每个 4 KB 页对应一个 struct page 结构体。使用一个 struct page 管理一个页,这本身没什么问题。但是当使用的页的大小是 2 MB 甚至 1 GB 时,Linux 依然以 4 KB 为单位分配 struct page,这显然是个内存浪费的行为。我的目的就是尽可能减少这部分冗余的内存管理开销。”说这话的是 STE 工程师宋牧春。2019 年 7 月,宋牧春加入字节 STE 内核团队,三年时间,宋牧春随团队一同成长,也完成了从 Linux 内核开发者到 Linux 内核维护者的转变,并成为 Linux 内核社区 HugeTLB 和 Memory Cgroup 两个核心子模块的 maintainer。


实际上,Linux 内核内存管理冗余并不是一个新问题,它在业内已存在十年之久。过去不少公司都做过研究,但始终没有找到解法。即便如此,STE 内核团队依然想做一些尝试。在不断地讨论、验证各种方案的可行性后,团队发现这个问题是有可能被解决的。


“某些场景会使用到大页,每个大页需要 8 个页的 struct page 去管理,即 8X4K 的内存,我们希望最终只占用一个页的物理内存(4KB)。对此,我们想的方案是复用,把后面 7 个虚拟地址映射到唯一的物理页,如果方案能成功落地,则意味着 1T 的服务器,最大能节省接近 16GB 的内存。即使优化 1%,整体给公司带来的收益也会非常大。”宋牧春说道。


这套方案被称作 HVO (HugeTLB Vmemmap Optimization)。方案有了,下一步就是做代码调研。


Linux 内核管理是非常复杂且核心的一个模块,它和各个模块交织在一起,它的稳定性也必然会影响整个 Linux 内核的稳定性。因此,STE 内核团队需要尽可能地减少该方案代码涉及的范围,并确保不会影响系统里的其他功能。为此,从 2020 年 4 月到 2021 年 6 月,团队开始了长达一年时间的代码调研、开发、测试和重构。


用一年的时间,解决一个技术难题,值得吗?段熊春给出了肯定的回答。


“我们会衡量这件事情的价值,显然我们也面临着很多压力,但真正难的事情是需要投入更多时间去看的,我们也需要这样做。基于对技术的狂热,我们周末也经常聚在一起讨论和思考,再把这些想法带到实际场景中,更好的打磨和优化。这是一个长期的过程,而这些突破也能为公司和业界带来巨大的收入,这就是有价值的。”


同时,HVO 也得到了业界的广泛认可:华为、Google、AWS、甲骨文都准备将这个方案投入使用,还有公司向团队发来感谢信。“但这不是终点,我们会持续优化 HVO 方案。”段熊春说道。

Linux 内核云原生技术新探索


设备虚拟化技术作为云计算领域最重要的基础技术之一,多年来一直在稳步向前演进。其中,virtio 和 VFIO 在过去一直是最主流的设备虚拟化技术,并分别于 2008 年、2012 年被合入 Linux 内核主线。为了将 virtio 和 VFIO 的优势结合,2020 年,vDPA(Virtio Data Path Acceleration)技术框架被合入 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_SETUP ioctl 来初始化每个 virtqueue 的配置,如 virtqueue 的最大长度等。


在初始化之后,VDUSE 设备可以通过 VDPA_CMD_DEV_NEW 这条 netlink 消息绑定到 vDPA 总线。之后,用户空间可以在 /dev/vduse/$NAME 上通过 read()/write() 来接收并回复来自 VDUSE 内核模块的一些控制请求,同时还可以通过 mmap() 映射一段共享内存,与内核相应的 virtio 驱动进行数据通信。


2020 年 10 月,STE 内核团队向 Linux 内核社区正式开源 VDUSE。经过一年时间,VDUSE 在 Linux 5.15 版本被正式合入。


“在计算存储分离的架构下,我们可以在计算节点通过 VDUSE 框架模拟各类存储设备供容器或虚机使用,这类存储设备的后端往往是远端的存储节点。现在,这套解决方案在字节的云原生场景已经开始大规模部署。后续,我们也将继续探索在云原生高性能网络场景上的应用可行性。”谢永吉说道。


Linux 内核始终在向前演进,在 STE 工程师邓良看来,“随着云原生应用场景不断扩大、硬件朝着高密度应用异构的机型上发展,对 Linux 内核提出了新的要求。内核是连接底层硬件和上层云原生应用的一个桥梁,我们也在思考,当前这种单一的宏内核是否合适,并且我们也在做一些探索。”

拥抱社区,让技术产出更大的收益和价值


如果说攻克技术难关靠的是技术硬实力,那么向社区推广并使其合入我们的代码,则要依靠足够多的耐心去沟通和布道。


在与社区沟通上,STE 内核团队也积累了自己的经验。


2020 年 9 月,当 HVO 第一个版本发到社区后,团队收到很多质疑的声音。“社区起初对我们的方案产生怀疑,我们需要先向社区证明这个方案没有问题。同时,社区也会提出一些针对性的问题,甚至有很多都是我们之前没有考虑过的场景。根据这些问题,我们再对方案进行迭代和维护。像 HVO,我们迭代了 20 多个版本,需要不断地向社区证明这个方案在不同场景的有效性,这个过程持续了很长的时间。”回忆 HVO 的社区之路,宋牧春觉得特别漫长。在他看来,社区需要考虑维护成本是否大于收益,这无可厚非,作为开发者和社区贡献者,要做的就是解释清楚技术方案能够产生的价值,让社区看到它带来的收益,并证明这个方案的可行性和稳定性。


在企业内部,一套技术方案从开发到应用,这个链路并不复杂。但面向社区,开发人员需要考虑的问题就会更多。“很多时候,我们要突破自有场景,去看社区里的其他场景和痛点,而这些很可能是我们从来没有遇到过的。”显然,拥抱社区的沟通成本会很高,但在段熊春看来,为社区贡献代码能够实现双赢,这都是值得的。


“现在我们的工作环境基本是模拟社区环境,工作模式也跟社区保持一致。这种标准化的作业模式能有效降低代码的维护成本,同时社区思维的开阔性,也为我们思考问题提供了更多的思路,进而为技术创造价值提供了更多的可能性。”

走进“无人区”


对于 STE 内核团队的愿景和目标,张宇用了三个“贴近”来描述:贴近业务,去了解业务的痛点;贴近社区,去了解社区的方向;贴近新硬件技术,在软硬协同设计上发挥内核更大价值。内核本身无法直接创造价值,更多是通过服务业务来创造价值。所以团队在做研发时,一定要想清楚对业务的收益是什么,它能否真正的解决业务痛点,进而创造业务价值。


STE 内核团队多年来一直深入社区。基于开源 Linux 操作系统,团队做了一些优化以满足企业内部的需求,反之,团队也会把这些好的特性回馈给社区,像前文提到的 HVO 和 VDUSE 都已被合入 Linux 内核主线。在张宇看来,STE 内核团队并不是要做一个标新立异的操作系统,更多的是源自技术初心,希望能够把自身的力量贡献给社区,交给 Linux,再不断引进。


张宇表示,STE 团队非常重视“务实”,这也是字节的核心价值观之一。“我们在做的事情都是围绕基础设施展开的,提高它的稳定性、优化性能等等,与公司内其他能直接创造收益的明星产品相比,我们是一个做减法的部门,通过技术手段降低基础设施成本,在业务链路里属于非常靠后的位置,就像足球场上的后卫一样,要能守住系统稳定性 / 可靠性的基本盘不出问题,又要能够往前场助攻进球。回到团队的愿景来看,我的想法比较简单务实,希望团队先满足业务的需求,再高于业务需求、先于业务需求,做一些引领业界的技术。就像一开始,我们是跟着社区,跟着业界领先者的路径去走,但随着我们技术能力不断提升以满足业务场景多样性的需求,再往前走,必将进入‘无人区’。”


进入“无人区”后,没有方向的指引,也没有参照物,这才是最考验团队能力和韧性的时候。“我希望团队有开拓精神,辨识出合理的方向并坚定的走下去,也许在过程中会有微调,但最后顶多画出来的路线是波浪线,而不是一条完全没有目标的曲线。”张宇说道。

写在最后


直到今天,团队对 HVO 的优化还在继续。2022 年 3 月,团队优化了 HVO 在 2 MB HugeTLB 的表现,与此前相比,它进一步将 2 MB HugeTLB 的 struct page 开销减少了 12.5%;2022 年 4 月,HVO 支持 ARM 64 架构;2022 年 5 月,HVO 支持运行时开关,不再束缚于 cmdline 的方式使能。


依托 Linux 内核,团队在虚拟化、云原生、eBPF 等技术方向上也在继续探索着。


“现在我们关注的比较多的场景,一个是云原生,这也是大家都在关注的方向,但当前并没有一个特别好的解决方案,甚至在云游戏的一些基础设施场景下,业界还没有形成一个标准;另一个就是软硬协同,用软件的方式定义硬件,用硬件的方式来定义软件。目前我们也围绕这些方向在做一些研究。”张宇认为,“如果团队一直在做一些重复的事情,是没有激情与战斗力的,对团队的期待还是要在满足业务需求之上,去做一些引领业界的事情。”


在张宇看来,做操作系统这类基础软件不是一时热情,是需要长期投入的。大浪淘沙沙去尽,沙尽之时见真金。“目前国内外大厂也都在围绕自己的业务场景做软硬一体的事情,涉及基础系统软件、芯片板卡服务器之类的硬件研发。在做的同时也要上升到社会责任感的层面上来看,能贡献多少力量。这些都是需要持续思考的。”

嘉宾介绍:


张宇,字节跳动 STE 团队负责人

段熊春,字节跳动 STE 内核团队负责人

宋牧春,字节跳动 STE 工程师、Linux 内核社区 HugeTLB 和 Memory Cgroup 两个核心子模块的 maintainer

谢永吉,字节跳动 STE 工程师

邓良,字节跳动 STE 工程师


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2022-11-18 10:5312765

评论

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

Go Modules 常见使用陷阱

Rayjun

go modules Go 语言

火爆全网!2021年最新发布Java面试清单(九大技术点)

比伯

Java 程序员 架构 程序人生 架构师

一篇文章让你彻彻底底理解 I/O 多路复用

Java 程序员 架构 面试 计算机

Redis 内存碎片清理

escray

redis 学习 极客时间 3月日更 Redis 核心技术与实战

Go语言的初体验

Phoenix

Go 语言

区块链如何助力中小企业解决融资难题

CECBC

区块链

Kubernetes 弃用 Docker 后如何切换到 Containerd

倪朋飞

Docker Kubernetes 微服务

那些不得不知的缓存知识

Java 缓存 程序员 面试

Wireshark数据包分析学习笔记Day24

穿过生命散发芬芳

Wireshark 数据包分析 3月日更

极客时间·产品训练营·第八周作业

二大爷

极客大学产品经理训练营

蚂蚁开源增强版 SpringBoot,都有高级特性?

Java小咖秀

开源 springboot 蚂蚁金服 SOFA

初识Golang之条件语句

Kylin

基础语法 3月日更 Go 语言

LeetCode链表专题01: 反转链表

小马哥

Java 链表 LeetCode 数据结构与算法 七日更

mysql 检索分享上篇

new life

MySQL-技术专题-知识点介绍

洛神灬殇

MySQL

Vue3源码 | 如何挂载组件元素?

梁龙先森

源码分析 大前端 Vue3

设计与思考,关于资源和生命周期(三)

程序员架构进阶

设计模式 架构设计 28天写作 3月日更 池化技术

区块链通证经济——资产流动性的变革

CECBC

资产流动性

架构师知识笔记2

felix徐

mysql实现主主数据库(双机热备)

大奎

K8s各节点常用命令

happlyfox

学习 k8s 3月日更

软件工程笔记:学习方法

风翱

软件工程 笔记 3月日更

Redis - AOF

insight

redis 3月日更

周小川:数字货币将是下一代货币研究工作的核心

CECBC

数字货币

一束光的旅程

脑极体

阿里二面,面试官居然把 TCP 三次握手问的这么细致

鞋子特大号

面试 TCP 三次握手 四次挥手

使用雪花 id 或 uuid 作为 MySQL 主键,被老板怼了一顿!

Java小咖秀

MySQL 数据库 雪花算法 uuid 雪花id

10年后端开发程序员精心整理「C/C++ Linux服务器」 成长路线(附思维导图)

Linux服务器开发

Linux 后端 C/C++ Linux服务器开发 Linux后台开发

渣硕试水字节跳动,本以为简历都过不了,123+HR面直接拿到意向书

Java 编程 程序员 架构 面试

Kubernetes Ingress 可视化编辑器

倪朋飞

Kubernetes 网络

管理者如何才能不亲力亲为?

石云升

项目管理 28天写作 职场经验 管理经验 3月日更

我们这群90后,正在字节跳动“死磕”Linux内核 | 卓越技术团队访谈录_语言 & 开发_凌敏_InfoQ精选文章