去年,我们曾在博客上讨论过字节跳动(TikTok 的开发商)提出的名为Parker(PARTitioned KERnel,分区内核)的实用工具方案。这项实验性技术允许多个 Linux 内核同时运行。一年半之后,该项目发布了一个新的公共实用程序“Multikernel Linux (mklinux-v7.0-mk2)”。
这项技术引入了一种特殊的 Linux 内核变体,它允许在单个物理服务器上同时运行多个独立的内核实例。由于直接在裸机上运行,这项技术完全消除了对虚拟机管理程序或虚拟化层的需求,使每个实例都能直接访问分配的内存、CPU 和设备。
该项目基于最新发布的 Linux 7.0 内核,可通过 CONFIG_MULTIKERNEL 配置参数启用此功能。如果禁用此选项,则生成的内核与标准 Linux 7.0 内核完全相同,行为也相同。目前,此首个版本 (v7.0-mk2) 仅支持 x86_64 架构,旨在弥合传统虚拟化和容器隔离在性能和安全性方面的差距。
隔离且不影响性能
虚拟化的最大问题在于虚拟机管理程序带来的性能“开销”。相比之下,多内核 Linux 消除了虚拟机退出转换、二级内存转换以及设备模型产生的开销。
根据在 Xeon Gold 5418Y 处理器(蓝宝石 Rapids)上测试后公布的性能数据,多内核系统相比 KVM 虚拟机展现出显著的执行速度提升。例如,进程间上下文切换速度提升了 2,5 倍,管道延迟降低了一半以上(2,18 倍),而读写等基础系统调用的响应时间也提升了 25% 以上。
与传统的 Docker 容器相比,Multikernel 提供更强大的保护。由于容器共享同一个宿主机内核,内核级漏洞、内核崩溃或内部锁饱和等问题都会影响所有租户。而在 Multikernel 生态系统中,每个环境都拥有独立的内核;也就是说,即使一个实例发生严重故障,其他实例也能继续不受影响地运行,从而保证了环境的隔离性,非常适合在同一硬件上运行从 Web 服务器到高强度 AI 训练工作负载(机器学习)等各种应用。
使用 Kerf 进行动态分配和编排
多内核 Linux 使用主机内核来管理大量资源(CPU、内存和 PCI 设备)。内核利用现有的设备树结构(可通过 `/sys/fs/multikernel/` 访问),划分出这个资源池,并通过原生的 `kexec_file_load()` 子系统启动“子内核”。借助 Linux 的热插拔功能,这些资源可以在实例之间动态迁移,而无需重启服务器,从而确保性能的可预测性和实时可调性。
为了协调这个生态系统,开发者们引入了 Kerf 命令行工具。该工具管理实例的整个生命周期,并依赖于一些互补的开源模块。其中一个模块是 Lazy CMA,它可以在运行时分配连续的物理内存,而无需任何预启动配置。
另一个支柱是 DAXFS,这是一个允许实例直接在内存中共享文件系统的模块;因此,Kerf 可以直接在 Docker 容器镜像中启动子内核,利用其文件系统而无需模拟层,并使用内存描述符进行网络互连而无需数据复制。
值得一提的是,该首个版本已在 5 级分页架构和主动 KASLR 下通过了严格的稳定性测试,证明即使子内核崩溃,资源恢复也是完全安全的。
通过允许将因系统锁而发生冲突的工作负载(例如同一缓存上的大量取消链接或重命名进程)拆分到与物理处理器插槽对齐的单独内核上,多内核 Linux 展示了突破单个单体内核所施加的性能限制的能力,开启了服务器整合和高性能云计算的新时代。