谷歌是如何改进 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已经可以 ...
随机推荐
- Mybatis Plus (特性、快速入门、日志、CRUD)
Mybatis plus 可以节省很多的工作,所有的CRUD JPA yk-mapper Mybatis plus 偷懒的 简介: MyBatis-Plus(opens new window)(简称 ...
- ransac拟合
链接:https://zhuanlan.zhihu.com/p/62238520 RANSAC简介 RANSAC(Random Sample Consensus,随机采样一致)算法是从一组含有&quo ...
- 记一次google手机恢复出厂设置到root抓包全过程
前言 开始因为手机密码忘记了,不想重置,不然找店家root的工具都没了,自己也不会google root的操作,之前听说还挺麻烦的.操作了半天好了,确实是挺麻烦的,做个记录. 一.恢复出厂设置 还原教 ...
- 基于ArcGIS的三维路网可视化
1. 引言 ArcGIS作为GIS的集大成者,对于三维可视化方面也有集成,参考自:3D 折线 (polyline) 要素-ArcMap | 文档 (arcgis.com),可以使用ArcGIS来构造与 ...
- 地理探测器简介(R语言)
地理探测器 1. 地理探测器原理 空间分异性是地理现象的基本特点之一.地理探测器是探测和利用空间分异性的工具.地理探测器包括4个探测器. 分异及因子探测:探测Y的空间分异性:以及探测某因子X多大程度上 ...
- LeetCode-398 随机数索引
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/random-pick-index 题目描述 给定一个可能含有重复元素的整数数组,要求随机输出给定 ...
- LeetCode-1034 边界着色
题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/coloring-a-border/ 题目描述 给你一个大小为 m x n 的整数矩阵 gri ...
- ROS服务通信(C++)
ROS服务通信C++ 效果图 结构总览 友情提醒 每一步编辑完,执行一下 Ctrl+Shift+B进行编译,及时排查错误 准备工作 第一步:创建工作空间 配置:roscpp rospy std_msg ...
- Ubuntu离线安装 MySQL 5.7
来源:https://www.ngui.cc/article/show-581968.html?action=onClick 一.所需环境 操作系统:Ubuntu 20.04数据库:MySQL 5.7 ...
- fabric学习笔记11
fabric学习笔记10 20201303张奕博 2023.1.23 测试实践2 导入链码依赖包 package main import ( "github.com/hyperledger/ ...