谷歌是如何改进 GKE、Cloud Run 的 gVisor 文件系统性能的?
灵活的应用程序架构、CI/CD 管道和容器工作负载通常运行不受信任的代码,因此应该与敏感的基础设施隔离。一种常见的解决方案是部署纵深防御产品(如使用gVisor的GKE Sandbox)以通过额外的保护层隔离工作负载。Google Cloud 的无服务器产品(App Engine、Cloud Run、Cloud Functions)也使用 gVisor 对应用程序工作负载进行沙箱处理。
【本文由Cloud Ace整理发布,谷歌云服务请访问Cloud Ace 官网】
然而,增加防御层也会带来新的性能挑战。当 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 上运行!
谷歌是如何改进 GKE、Cloud Run 的 gVisor 文件系统性能的?的更多相关文章
- 【Android Developers Training】 89. 最大化的使用谷歌云消息(Google Cloud Messaging)
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 执行 npm run update-webdriver 提示文件不能获取错误
按照angularjs官网的入门教程中输入 npm run update-webdriver 总是提示 https://chromedriver.storage.googleapis.com/2.1 ...
- spring cloud config git库文件搜索顺序
spring.cloud.config.server.git.uri只配置到仓库那一层就行了,需要访问仓库的子目录的话就配置spring.cloud.config.server.git.searchP ...
- RestTemplate OR Spring Cloud Feign 上传文件
SpringBoot,通过RestTemplate 或者 Spring Cloud Feign,上传文件(支持多文件上传),服务端接口是MultipartFile接收. 将文件的字节流,放入ByteA ...
- spring cloud feign 上传文件报not a type supported by this encoder解决方案
上传文件调用外部服务报错: not a type supported by this encoder 查看SpringFormEncoder类的源码: public class SpringFormE ...
- Getting Started(Google Cloud Storage Client Library)
在运行下面的步骤之前,请确保: 1.你的项目已经激活了Google Cloud Storage和App Engine,包括已经创建了至少一个Cloud Storage bucket. 2.你已经下载了 ...
- Spring Cloud中关于Feign的常见问题总结
一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...
- 写给大忙人的spring cloud 1.x学习指南
这几天抽空搞了下spring cloud 1.x(2.0目前应该来说还不成熟),因为之前项目中使用dubbo以及自研的rpc框架,所以总体下来还是比较顺利,加上spring boot,不算笔记整理,三 ...
- Cloud Native Weekly | Kubernetes 1.13发布
云原生一周精选 1——Kubernetes 1.13发布 2——Kubernetes首次出现重大安全漏洞 3——Docker和微软公司推出云原生应用的部署规范 4——谷歌推出beta版本的Cloud ...
- 安卓基于谷歌串口api进行串口开发
准备材料 AndroidStudio 谷歌android-serialport-api 前情提要 网上提供很多基于c语言对安卓串口开发,有jni.cmake等等,不过都太高深,谷歌提供的api已经可以 ...
随机推荐
- day12-SpringMVC文件上传
SpringMVC文件上传 1.基本介绍 SpringMVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的.spring 用 Jacarta Com ...
- bat脚本登陆ftp服务器
用bat脚本登录ftp服务器,下载指定文件. 第一次脚本,有问题,你发现了么? 由于每个">>"重定向符号之前都习惯用空格(python style),导致写道ftp. ...
- Training Spiking Neural Networks with Local Tandem Learning
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 36th Conference on Neural Information Processing Systems (NeurIPS 202 ...
- 【USACO 2021 US Open, Gold】Permutation
\(\text{Solution}\) 发现每个时刻的状态一定是所有点在一个最外围三角形的内部 设 \(f_{i,j,k,p}\) 表示排列填到第 \(p\) 位,此时图形最外围的三角形是以编号为 \ ...
- JZOJ 4417. 【HNOI2016模拟4.1】神奇的字符串
不能算解析的解析 很神仙的题 知道做法后很容易实现 这里不写题解 推荐一个:4417. [HNOI2016模拟4.1]神奇的字符串 感谢写此博文的神犇! \(Code\) #include<cs ...
- 三天吃透Java虚拟机面试八股文
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- 3D模型在线查看工具
3D场景工具推荐:NSDT场景编辑器. glTF Viewer 2.0是一个可以在线查看GLTF格式3D模型的,可以对模型进行显示设置.灯光设置来查看模型效果,除此之外还可以对模型进行性能分析和模型验 ...
- 动手写了个简单版的ChatGPT的Java版客户端
最近ChatGpt大火,我在年前申请过账号忘了下确实强大. 作为Java程序猿社畜就尝试写了个Java版本的简易版客户端. 源码地址:https://github.com/Grt1228/chatgp ...
- Linux常用命令 转于WoW_Boom
一.常用命令 1.进入到用户根目录cd ~ 或 cd 2.查看当前所在目录pwd 3.进入到itcast用户根目录cd ~itcast 4.返回到原来目录cd - 5.返回到上一级目录cd .. 6. ...
- 使用 Fiddler Everywhere 进行抓包
使用 Fiddler Everywhere 进行抓包 开启各项必备功能 在打开浏览器之前需要先开启LiveTraffic为Capturing 然后点击像芯片一样的东西叫Decode(蓝色为开启状态)这 ...