FreeBSD 現(xiàn)在能在 25 毫秒內(nèi)完成啟動

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



























