谷歌是如何改进 GKE、Cloud Run 的 gVisor 文件系统性能的?

【本文由Cloud Ace整理发布,谷歌云服务请访问 Cloud Ace 官网】

灵活的应用程序架构、CI/CD 管道和容器工作负载通常运行不受信任的代码,因此应该与敏感的基础设施隔离。一种常见的解决方案是部署纵深防御产品(如使用gVisor的GKE Sandbox)以通过额外的保护层隔离工作负载。Google Cloud 的无服务器产品(App Engine、Cloud Run、Cloud Functions)也使用 gVisor 对应用程序工作负载进行沙箱处理。

然而,增加防御层也会带来新的性能挑战。当 gVisor 的用户空间内核需要多个操作来遍历文件系统路径时,然后谷歌发现了一个这样的挑战。为了解决这个问题并显着提高 gVisor 的性能,编写了一个全新的文件系统层,同时考虑到性能,同时保持相同级别的安全性。新文件系统 (VFS2) 减少了为文件系统系统调用提供服务所需的操作数,减少了锁争用,更有效地分配内存,并提高了与 Linux 的兼容性。

纵深防御和文件系统

第一层防御是在用户模式下运行的 gVisor 内核。gVisor 威胁模型假设恶意容器可以破坏 gVisor 的内核,同时仍将恶意容器与底层主机基础设施或其他工作负载隔离开来。由于 gVisor 内核不可信任,因此它无法直接访问文件系统。文件系统操作由代理(称为 Gofer)代理,该代理与可能的恶意工作负载隔离。打开、创建和统计等操作被转发到代理,经过审查,然后由代理执行。Gofers 作为一个单独的进程运行,pod 中的每个容器一个,并且还受到深度防御层的保护,仅授予它所需的访问权限。

在 gofer 授予对文件的访问权限后,在 gVisor 内核文件系统返工之前,需要大量操作来遍历文件路径,从而导致一些性能缺陷。这个问题在使用 gofer 挂载文件系统时尤为明显,其中每个操作的往返成本因 RPC 和调度成本而加剧。更值得注意的是,gVisor 沙箱会向 gofer 发出新的 RPC 以遍历每个路径组件,这会大大降低性能。

改进的文件系统性能

应对这一挑战需要使 gVisor 的哨兵能够将路径解析直接委托给文件系统。这允许 gofer 文件系统发出单个 RPC 来执行大型遍历,而不是为操作中的每个路径组件发出一个 RPC。例如,在 VFS1 中,stat(/foo/bar/baz) 向 gofer (foo, bar, baz) 生成至少三个 RPC,而 VFS2 只生成一个。

借此机会,谷歌重新设计了 sandbox-gofer 协议层。而早些时候使用的是 9P2000.L 协议的修改版本。然而,这个协议非常繁琐,发出许多 RPC 并消耗大量内存。谷歌构建了一个名为LISAFS(Linux 沙盒文件系统协议)的新协议来替代 9P。LISAFS 在 RPC 和内存使用方面更经济。LISAFS 为多路径组件行走提供 RPC。VFS2 中的 gofer 文件系统现在可以使用 LISAFS 执行这种一次性遍历。LISAFS 还可以通过 RPC 执行更快的文件 IO。

执行频繁文件系统操作(如打开、创建、统计、列表和加载库)的工作负载正在使用 VFS2 和 LISAFS 提高性能。这些工作负载的示例包括运行解释性语言(例如 Python 和 NodeJS)以及大量导入,或者从源代码构建二进制文件。CI/CD 工作负载(例如 bazel)构建在大型代码库上,并提供对文件系统性能的深入了解。此类工作负载必须打开和读取大量源文件,并写入大量目标文件和二进制文件。

以下是截至 2022 年 12 月构建gRPC和Abseil 的开源 bazel 基准测试的结果。这些基准测试在类似 GKE 的环境中运行。要理解结果,理解以下术语会很有帮助:

·Runsc overhead:这是 gVisor 相较于 native 增加的性能开销。例如,如果本机运行工作负载(使用 runc)需要 10 秒,而 runsc 需要 13 秒,则 runsc 开销为 30%。

·Root:项目的源代码放在根文件系统中,以独占方式挂载。这意味着沙盒可以完全控制文件系统并使用更积极的缓存来提高性能。

·绑定:项目源代码放在绑定挂载中。所有绑定挂载都以共享模式挂载。这意味着可能会发生文件的外部修改,并且 gVisor 会在每次访问时重新验证缓存以确保状态是最新的。

·tmpfs:项目源代码放在tmpfs(内存文件系统)中。

可以看到 VFS2 和 LISAFS 持续改进所有这些配置的性能,并使 runsc 更接近本机 (runc) 性能。

VFS2 和 LISAFS 现已在所有 GKE 和无服务器产品中 100% 推出,并在几个月内逐步推出了这些优化。这些还有助于缩短一些在初始化时执行大量文件系统工作的应用程序的冷启动时间。例如,从 2022 年 8 月开始的 App Engine LISAFS 推出数据显示,LISAFS 平均将冷启动提高了 25% 以上。

为大规模容器工作负载提供纵深安全防御帮助确定性能权衡,例如需要新实施的 gVisor 文件系统。这些改进大大缩小了性能差距,而无需牺牲安全性。VFS2 架构使大家能够在提供企业就绪容器安全解决方案的同时,继续改进安全性和性能权衡。

立即试用 GKE Sandbox 以增强工作负载安全性

GKE Sandbox 为您的工作负载提供了额外的安全层,您今天就可以试用了。阅读启用 GKE 沙盒指南,通过查看GKE 沙盒概述了解有关容器安全的更多信息,或者立即开始使用 Google Cloud免费试用。

如果您想更深入地了解技术细节,您可以查看官方 gVisor 文档,查看GitHub 上的源代码,甚至可能做出贡献。期待看到更多沙盒工作负载在 Google Cloud 上运行!

作者:CloudAce原文地址:https://segmentfault.com/a/1190000043391046

%s 个评论

要回复文章请先登录注册