Google通过改进gVisor提升沙盒容器文件系统性能

Google 改进 gVisor 文件系统性能

Google 最近对其开源隔离层 gVisor 的文件系统实现进行了改进。gVisor 是 Google 商业容器化产品(如 App Engine、Cloud Run 和 Cloud Functions)中使用的隔离层。据 Google 工程师 Ayush Ranjan 和 Fabricio Voznika 介绍,新的 gVisor 文件系统(称为 VFS2)可以将文件密集型工作负载的性能提高约 50%-75%。

gVisor 的主要目标

gVisor 的主要目标是在容器与底层内核之间提供隔离层,底层内核由同一节点上运行的所有容器共享。为了防止恶意或易受攻击的容器危及整个节点的安全,gVisor 实现了 Linux 系统接口的很大一部分,包括一个符合 Open Container Initiative 标准的运行时 runsc,该运行时在应用程序和主机内核之间提供了隔离边界。

由于 gVisor 内核不可信,因此它无法直接访问文件系统。文件系统操作通过一个代理(称为 Gofer)进行中介,该代理与可能恶意的工作负载隔离。诸如打开、创建和状态检查等操作会被转发到代理,经过审查后由代理执行。

性能问题与改进

Google 工程师发现,gVisor Gofer 文件系统处理路径解析的方式(通过使用每个路径组件一个 RPC 调用将其委托给底层文件系统)对性能有害。这对于频繁执行文件操作的工作负载(如构建任务或运行具有大量导入的 Python 和 NodeJS 程序)尤其如此。

为了解决这一问题,Google 增加了 gVisor 的 Sentry 直接委托路径解析给文件系统的能力。例如,在 VFS1 中,stat(/foo/bar/baz) 会生成至少三个 RPC 调用(分别对应 foo、bar 和 baz),而在 VFS2 中只生成一个 RPC 调用。

新协议 LISAFS

此外,Google 还借此机会为 gVisor 沙盒与 Gofer 之间的通信创建了一个新协议,称为 LISAFS(Linux 沙盒文件系统协议)。新协议减少了 RPC 调用的数量以及内存使用量,从而改进了多路径组件的遍历并加快了文件 I/O。

性能提升效果

根据 Ranjan 和 Voznika 的说法,这些更改将 runsc 引入的开销减少了 50%-75%。最大的改进是在使用绑定挂载时,与将源代码托管在根文件系统或内存文件系统中相比。这些结果是通过运行官方 bazel 基准测试来构建 gRPC 和 Abseil 获得的。

基准测试结果得到了实证数据的支持,数据显示 Google App Engine 的冷启动时间在整个平台上提高了 25% 以上,这一数字包括所有类型的工作负载,而不仅仅是文件系统密集型的工作负载。

阅读 76
0 条评论