Youki:用 Rust 编写的更快Docker容器运行时

21-12-27 banq

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 使用结构化类型,这通常非常好用。除非它不是并且您不小心在某处破坏了隐藏的不变量。

我发现隐式接口实现非常令人沮丧。试图了解实现的内容真的很烦人。

 

 

1
猜你喜欢