去年,我們曾在部落格上討論過位元組跳動(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 展示了突破單個單體內核所施加的性能限制的能力,開啟了伺服器整合和高效能雲端運算的新時代。