核心概念
本文提出了一種名為 Mewz 的新型輕量級 WebAssembly 執行環境,透過結合單核心技術和 WASI,解決了雲端環境中容器和虛擬機器的可移植性和效能開銷問題,並透過實驗證明了其在執行 WebAssembly 應用程式方面的低開銷優勢。
導言
雲端運算需要為工作負載提供隔離性和可移植性。
虛擬機和容器廣泛用於滿足這些需求,但存在兩個問題:容器映像檔依賴於主機作業系統和 CPU 架構,以及虛擬機器和容器的開銷導致效能下降。
現有解決方案未能同時解決這兩個問題。
背景
雲端運算的兩個主要需求:隔離性(防止用戶之間的干擾)和可移植性(輕鬆遷移到不同的雲端環境)。
虛擬機器和容器的組合使用存在兩個問題:容器映像檔的可移植性受限於相同的主機作業系統和架構,以及虛擬機器和容器的開銷同時發生。
單核心
單核心是一種輕量級核心,旨在在雲端中運行。
單核心將單個應用程式與核心靜態鏈接到單個核心映像檔中,減少了系統呼叫的開銷。
然而,單核心映像檔依賴於架構,因此不能解決可移植性問題。
Wasm
WebAssembly (Wasm) 是一種用於可執行代碼的可移植二進制格式。
Wasm 有一個名為 WebAssembly 系統介面 (WASI) 的 API 規範,為 Wasm 提供系統資源。
Wasm 的獨立於作業系統/CPU 架構以及 WASI 吸收平台差異的能力使其成為解決可移植性問題的理想選擇。
然而,Wasm 本身不能提供雲端運算所需的隔離性,因此需要虛擬機器隔離,這意味著使用 Wasm 作為容器的替代方案並不能解決虛擬化開銷問題。
架構
本文提出了一個結合 Wasm 和單核心的新系統,以解決可移植性和開銷問題。
應用程式被編譯成 Wasm 二進制文件並分發。在雲端環境中,Wasm 二進制文件被鏈接到單核心映像檔中。然後,單核心映像檔在虛擬機器上運行。
這種架構受益於單核心的輕量級特性,同時確保了二進制文件的可移植性。
具有 WASI API 的單核心
Mewz 是一個提供 WASI API 給 Wasm 二進制文件的單核心。
Mewz 通過在構建時與 Wasm 應用程式靜態鏈接來執行它。
Mewz 僅提供 WASI 實現所需的功能,從而最大限度地減少了功能,例如,它不實現線程功能。
Wasm 的 AoT 編譯器
為了靜態鏈接 Mewz 和 Wasm 二進制文件,本文實現了 Wasker,一個將 Wasm 二進制文件轉換為目標 CPU 架構上的原生代碼的 AoT 編譯器。
Wasker 將 Wasm 二進制文件編譯成一個目標文件,將 WASI 函數保留為未解析的符號。
通過 Wasker 進行 AoT 編譯後,目標文件通過符號解析與 Mewz 鏈接。
效能評估
本文通過運行一個分發靜態文件的簡單 HTTP 伺服器來評估系統的效能。
比較了四種環境的效能:Mewz、WasmEdge、Nanos 和 Linux。
結果表明,Mewz 的吞吐量比 Linux 上的 WasmEdge 高 1.3 倍,這表明 Mewz 的開銷低於 Linux 上的 WasmEdge。
然而,Linux 和 Nanos 的吞吐量分別比 Mewz 高 2.5 倍和 2.2 倍,這可能是因為 Rust 編譯器生成的 Wasm 二進制文件的優化不足。
相關工作
Firecracker 是一個基於 KVM 的虛擬機器監視器,旨在實現快速啟動時間、小內存佔用空間和接近物理機的效能,同時確保高度隔離。
gVisor 是一個容器運行時,它以與主機系統高度隔離的方式運行容器,旨在減少無伺服器計算中的虛擬化開銷。
結論
本文提出了一個結合 Wasm 和單核心的新系統,解決了在雲端運算中使用容器和虛擬機器時的可移植性和開銷問題。
通過採用 Wasm,它使應用程式能夠在任何主機作業系統和 CPU 架構上運行,這與容器映像檔不同。
將 Wasm 作為單核心運行減少了伴隨虛擬機器隔離的客戶作業系統的開銷。
為了實現這種架構,本文開發了一個具有 WASI API 的單核心和一個將 Wasm 轉換為原生代碼的 AoT 編譯器。
通過運行一個編譯成 Wasm 的簡單 HTTP 伺服器,評估了系統的效能。
結果表明,它運行 Wasm 應用程式的開銷低於現有的 Wasm 運行時。
統計資料
Mewz 的吞吐量比 Linux 上的 WasmEdge 高 1.3 倍。
Linux 和 Nanos 的吞吐量分別比 Mewz 高 2.5 倍和 2.2 倍。
執行 Wasm 代碼和執行 WASI 函數佔用了 Mewz 很大一部分的 CPU 週期。