FreeBSD 現在能在 25 毫秒內完成啟動
在更換了 FreeBSD 內核中的排序演算法後,其啟動速度提高了 100 倍以上……雖然這是專門針對 微虛擬機 的優化,但所有人都應能從中受益。
過去五年,微虛擬機在科技研發領域中備受關注。其核心理念是重新包裝和創新了 IBM 在 1960 年代隨著 虛擬機管理程序 誕生所發明的 一些概念和技術:設計專門作為另一個操作系統上的訪客系統運行的操作系統。這意味著該操作系統必須專門構建在虛擬機內執行,並與特定的管理程序提供的資源進行交互,而不是模擬硬體。
這就意味著訪客操作系統幾乎不需要針對真實硬體的支持,只需要 VirtIO 驅動,它們可以直接和宿主機的管理程序提供的功能進行交互。反過來說,管理程序無需提供模擬的 PCI 匯流排、模擬的電源管理、模擬的顯卡、模擬的網卡等等。結果就是,管理程序本身可以變得更加微型和簡化。
通過無情地縮減虛擬機監視器和運行在其內部的操作系統,這讓兩端都能更小、更簡潔。意味著虛擬機能更少的使用資源,並能更快速地啟動。
目前,這個商業目標是提供 「 無伺服器 」 的計算能力。實際上,「無伺服器」 是一種市場雙關語:當然,真實世界中的伺服器仍存在於某個數據中心中。但這與提供「基礎設施即服務(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。接著,對其模擬的唯一的硬體,串列控制台,進行初始化也失敗了。
在內核成功啟動之後,內存的使用迅速成為了一個問題: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 能夠越小,並且使用的資源越少,無論是對容器還是整個機器的整體性能來說都會更好。
(題圖:MJ/a5910e84-656d-4a5c-abad-bb0b0ffcb3fc)
via: https://www.theregister.com/2023/08/29/freebsd_boots_in_25ms/
作者:Liam Proven 譯者:ChatGPT 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive