FreeBSD 現在能在 25 毫秒內完成啟動
在更換了 FreeBSD 內核中的排序算法后,其啟動速度提高了 100 倍以上……雖然這是專門針對 微虛擬機microVM
過去五年,微虛擬機在科技研發領域中備受關注。其核心理念是重新包裝和創新了 IBM 在 1960 年代隨著 虛擬機管理程序hypervisor 誕生所發明的 一些概念和技術:設計專門作為另一個操作系統上的訪客系統運行的操作系統。這意味著該操作系統必須專門構建在虛擬機內執行,并與特定的管理程序提供的資源進行交互,而不是模擬硬件。
這就意味著訪客操作系統幾乎不需要針對真實硬件的支持,只需要 VirtIO 驅動,它們可以直接和宿主機的管理程序提供的功能進行交互。反過來說,管理程序無需提供模擬的 PCI 總線、模擬的電源管理、模擬的顯卡、模擬的網卡等等。結果就是,管理程序本身可以變得更加微型和簡化。
通過無情地縮減虛擬機監視器和運行在其內部的操作系統,這讓兩端都能更小、更簡潔。意味著虛擬機能更少的使用資源,并能更快速地啟動。
目前,這個商業目標是提供 “無服務器serverless” 的計算能力。實際上,“無服務器” 是一種市場雙關語:當然,真實世界中的服務器仍存在于某個數據中心中。但這與提供“基礎設施即服務(IaaS)”模型不同,而是提供“函數即服務(FaaS)”的模式。這就代表著你不需要了解任何有關基礎設施的知識 —— 你的程序直接調用另一個程序,然后管理工具會運行所需的特定操作,返回結果,然后刪除用于執行計算的虛擬機。你根本不需要知道這過程在何處,如何進行。
對消費者來說,這種技術的優勢在于其快速和易用性。而對服務提供商而言,因為能夠更快地回收和再利用資源,使得相同的硬件能服務更多的客戶,這是一個巨大的優勢。
AWS 通過一項名為 Lambda 的服務提供 FaaS,這個名稱是來源于一個深奧的函數式編程術語。Lambda 由亞馬遜自家研發的 Firecracker 管理程序提供支持,Firecracker 同樣也支撐著 Fargate 這一無服務器服務。
Firecracker 基于 Linux 內核的內建 KVM 管理程序:這本身就有別于之前 AWS 基于 Xen 管理程序 的實踐。這也就意味著它本質上是一個 Linux-on-Linux 的解決方案。這聽起來對 FreeBSD 內核開發者 Colin Percival 來說像是一個挑戰,正如我們 一年前的報道:他決定在 Firecracker 上運行 FreeBSD。然而就如同大部分的計算任務一樣,優化的過程大致上是:首先,讓它可以運行;然后,提高其運行速度。
根據他本周稍早的一則 推文,他最新的性能優化成果相當令人震驚:替換排序算法使 FreeBSD 內核啟動過程加速了約一百倍,將內核加載時間降至了驚人的 25 毫秒。換言之,只有四十分之一秒的時間。
FreeBSD(HEAD)現已不再執行其 SYSINIT 上的冒泡排序。如今,我們運行的是更高效、速度大概快了 100 倍的歸并排序:https://cgit.freebsd.org/src/commit/?id=9a7add6d01f3c5f7eba811e794cf860d2bce131d
當 FreeBSD 內核在 Firecracker (配備 1 CPU,128 MB 內存)中啟動時,現在有大約 7% 的時間用于執行其 SYSINIT 上的冒泡排序。
當你需要對上千個條目進行排序時,
O(N^2)
的復雜度可能會帶來較大的影響。因此,是時候將冒泡排序替換為更高效的算法了。
這一調整只是一系列優化措施中的最新一個環節,兩天后,他進一步 詳細 闡述了這些優化。這包括了引導所需的初始更改:消除了假定在 Xen 下引導的一些初始化步驟,然后查詢 ACPI 獲取處理器的類型和數量。這一步出現了問題,因為 Firecracker 并未提供 ACPI。接著,對其仿真的唯一的硬件,串行控制臺,進行初始化也失敗了。
這個微調只是長期進行的一系列優化中的最新一環。幾天后,他更詳細地描述了這些更改。這些更改描述了讓系統啟動所需的初步改動:移除了假定在 Xen 下引導的幾個初始化步驟,然后嘗試向 ACPI 查詢處理器的類型和數量。然而,該嘗試失敗了,因為 Firecracker 并不提供 ACPI。接著,初始化它確實模擬的少量硬件之一——串行控制臺——也失敗了。
在內核成功啟動之后,內存的使用迅速成為了一個問題:Firecracker 默認只給客戶端分配了 128MB 的內存,原因在于一個必須修改的假設。之后是一整套的優化清單,每一項都為減少時間作出了一部分貢獻。
即便你不是特別懂技術,閱讀這篇文章也會很有趣。一些步驟更改了在專用硬件上引導的合理選擇,在虛擬環境中,這些選擇在機器產生、做工作、然后在幾秒鐘內再次被刪除的情況下,已經無法適用。
Percival 評論 稱:
我相信在相同的環境下,Linux 的引導時間是 75-80 毫秒,而我已經讓 FreeBSD 在 25 毫秒內引導。
他 接著 說道:
當我開始研究提速引導的過程時,內核大約需要 10 秒鐘的時間來引導,所以現在我擁有的內核引導速度,比我幾年前快約 400 倍。
目前,已經優化的系統內核是 FreeBSD 14 版的,運行在 x86-64 架構上,但也正在進行適配到 Arm64 的工作 —— AWS 是世界上 最大的 Arm 服務器用戶。
Firecracker 是眾多備受矚目的微虛擬機中的一員,但也有其他的微虛擬機,而且它的成功也激勵了 QEMU 開發者增加了一個 微虛擬機 平臺。Canonical 的開發者 Christian Erhardt 在 博客 上介紹了如何在 Ubuntu 中使用這種技術,并且在線代碼開發環境供應商 Hocus 最近 解釋 了為什么它從 Firecracker 轉移到了 QEMU 等價物。
我們可以看到微虛擬機有很多潛在的使用場景,不僅僅是在云場景中。能夠在一個完全不同的 OS 上運行為另一個 OS 構建的單個程序,而不需要始終運行完整的模擬環境,可能在各種情況下都非常方便。
容器是一個非常有用的工具,但在容器中你只能運行與宿主 OS 相同的二進制文件。運行任何其他的東西 —— 比如在 macOS 上運行 Docker Linux 容器 —— 意味著有一些模擬和一個訪客操作系統被隱藏在堆棧的某個位置。這個 VM 能夠越小,并且使用的資源越少,無論是對容器還是整個機器的整體性能來說都會更好。