Youki:用 Rust 編寫的更快Docker容器執行時

banq發表於2021-12-27

Youki 是一個用 Rust 編寫的低階容器執行時,它實現了OCI 執行時規範。簡單來說,youki 是一個可以建立容器的命令列工具。您可能聽說過的同一類別中的其他執行時是runccrun。當您使用 Docker 或 Podman 建立容器時,實際的容器建立會委託給像 youki 這樣的工具。

目前,許多容器工具是用 Go 實現的,在實現容器執行時需要特殊處理。例如,Runc 將一個 C 程式嵌入到其處理設定名稱空間的可執行檔案中,因為由於 Go 執行時的多執行緒特性,這在 Go 中是不可能的。

另一方面,C 可以用作實現語言,但這是以記憶體安全為代價的,此外,C 缺乏我們對現代語言所期望的高階語言結構。

因此,雖然 Go 和 C 是非常好的語言,但對於這個特定用例,我們相信 Rust 具有低階控制、記憶體安全和高階抽象的橫截面,非常適合實現容器執行時。

Youki 有可能比 runc 更快並使用更少的記憶體,因此可以在記憶體使用要求嚴格的環境中工作。這是一個容器從建立到刪除的簡單基準。

Runtime    Time (mean ± σ)    Range (min … max)
youki    198.4 ms ± 52.1 ms    97.2 ms … 296.1 ms
runc    352.3 ms ± 53.3 ms    248.3 ms … 772.2 ms
crun    153.5 ms ± 21.6 ms    80.9 ms … 196.6 ms

 

網友討論:

Rust 對 Go 的優勢:它在執行時浪費的資源更少,而不會影響安全性。這是唯一的好處。請記住,Go 已經與通道實現了安全併發——唯一的缺點是它速度較慢。在 DevOps 領域,99% 的執行時間都用於等待 IO —— 所以 Go 的缺陷根本不重要。

 

Rust 相對於 Go 的唯一好處是速度和安全性?

Go 程式碼包含 nil 指標,這意味著每次取消引用都可能使您的程式崩潰。

處理列舉充其量是尷尬的。與原始碼中的字串常量匹配是拼寫錯誤的一個祕訣,並且不可能在編譯時檢查所有模式是否都已處理。

使用型別的零值來表示缺失意味著您無法確定 0 是否實際有效或無效。

Go 使用結構化型別,這通常非常好用。除非它不是並且您不小心在某處破壞了隱藏的不變數。

我發現隱式介面實現非常令人沮喪。試圖瞭解實現的內容真的很煩人。

 

 

相關文章