基于SPDK-vhost的云原生Kubevirt虚拟化存储IO的优化方案

  • 摘要

本文主要介绍针对云原生kubernetes虚拟化IO的应用场景,在Kubevirt中引入SPDK-vhost的支持,来加速虚机中IO存储性能。同时基于Intel开源的Workload Service Framework[1]平台集成部署一套端到端虚拟化IO的应用场景做基本的性能对比测试。

  • 云原生Kubevirt虚拟化

在云原生时代,越来越多的业务开始逐步迁移到容器上来,容器也成为了一种不可或缺的资源发布和管理形式,同时由于场景的需求,有部分业务形态更适合运行在虚拟机,如何同时管控虚拟机和容器逐渐成为了云原生时代的主流需求,Kubevirt给出了完美的解决方案。VMKubernetes环境中的管理和部署工具Kubevirt Red Hat 开源的,是基于Kubernetes运行,具体的来说是基于KubernetesCRD(自定义资源)增加虚拟机的运行和管理相关的资源,特别是VMVMI资源类型。用户可以在K8S环境中通过CRD进行增加关于虚拟机的资源类型,再通过部署VM.yaml的形式来创建虚拟机等一系列的操作。

c2089c4450a5976a11b3a154b688632a.png

1:云原生Kubevirt架构介绍

如图1所示绿色模块是Kubevirt的原生插件和功能模块,在master上部署virt-controllervirt-apivirt-api是管理虚拟机资源及其运营管理的接口,而virt-controller则负责管理和监控VM实例对象及其关联的POD,其中virt-launcher POD就是virt-controller依据VM的配置文件来创建的。这里需要关注的是virt-launcher POD,每一个virt-launcher承载一个VM实例,其内部是通过libvirtd来管理虚拟机的生命周期。

  • 引入SPDK-vhost加速Kubevirt虚拟化IO

在实际边缘计算和云计算应用场景中,不少客户使用云原生的Rook-Ceph来部署后端存储服务。以常用的block设备为例,用户在创建虚机之前,先通过PV/PVCRook-Ceph存储申请volume资源,在创建虚机的时候挂载到VM中,如下图2所示。这种Kubevirt虚机挂载使用Ceph block IO的本质是通过Ceph kernel rbd来提供block块设备,而Kubevirt的虚机则是使用传统的virtIO的前端和后端方案,实际的应用中,会带来频繁的用户空间和内核空间的切换,同时这种基于Qemu-KVM的半虚拟化的IO模型会伴随着大量KVMVM EXITVM ENTRY事件,同时产生大量中断,这会带来不少系统资源的消耗和IO latency 的增大。

7f608cbcbb3cd5253cff8f40bf7497a2.png

2Kubevirt VMCeph存储上的使用

集成SPDK-vhostKubevirt

众所周知,业界为了优化virtIO的虚拟化IO性能,而引入vhost的模型,以便减少频繁的用户空间和内核空间的切换和数据的拷贝。而在我们云原生虚拟化场景中引入了SPDK-vhost在空户空间的一种虚拟化IO优化的方案,基于KubeVirt中引入SPDK-vhostdeamonset模块来加速VMblock IO的访问,对于SPDK-vhost的具体细节可以参考SPDK官网介绍[2]。如下图3所示,我们针对Kubevirtvirt-launcher模块进行优化,加入spdk-vhost-user的接口功能,提供对SPDK-vhost的接口检测和通讯,以便在VMI实例中使用SPDK-vhost的接口给VM提供加速的block功能。同时,当在K8S集群中部署Kubevirt的时候我们同时会在集群中部署SPDK-vhost daemonset,在每个节点都会部署一个SPDK-vhost功能POD。而SPDK-vhost POD中的接口会相应的检测和并通过librbd链接到后端的Rook-Ceph,创建对应的SPDK rbd bdev 设备,再以此bdev设备创建vhost-block controller。基于此,当virt-launcher发起创建虚机的过程中,vhost-user接口模块会解析VM yaml文件中定义的块设备信息,并链接到SPDK-vhost POD 向该模块申请特定size block设备,而SPDK-vhost守护进程则会向Rook-Ceph申请对应的卷空间,一旦成功,则会在VM中成功看到虚拟磁盘,而此虚拟磁盘则是基于Ceph块设备通过SPDK-vhost加速之后提供的。

14d14a83c7935cda6ae416f19bcdba48.png

3:引入SPDK-vhostKubevirt架构

下面介绍一下KubeVirt虚机的部署过程中SPDK-vhost功能的接口。如下图4所示,SPDK-vhost模块支持对Rook-Ceph的存储功能管理和链接,能够按需申请Ceph RBD存储卷,并在SPDK内部对应的创建rbd-bdev逻辑设备,再将bdev设备挂接到创建的vhost block controller上,而虚机中vdisk是通过共享内存的方式和SPDK-vhost做数据传输。在控制面,virt-launcher中的libvirt是通过链接SPDK-vhost所提供vhost socket来实现通讯。

48006df10c6a30618293e80e3cdc2ae0.png

4:基于SPDK-vhostKubevirt VM的接口机制

对于新的方案的部署和实施流程如下图5所示,以Rook-Ceph为后端存储为例,用户需要在Kubernetes集群环境中预先部署Rook-Ceph和优化过的Kubevirt版本。同时确保SPDK-vhost daemonset正常部署到集群中(当前示例是将SPDK-vhost deamonset单独作为一个模块部署,没有和kubevirt的部署集成到一起)SPDK-vhost POD中有接口会检测Root-Ceph的环境健康状态并建立链接。随后用户基于编写好的VM yaml文件部署虚机,通过virt-api的将创建VM的信息和资源申请传递给virt-controller,那么virt-controller则会创建virt-launcher POD以便在内部创建VM实例。如下图所示,virt-launcher会往本地nodeSPDK-vhost POD发送创建volume的请求,SPDK-vhost POD则会通知Rook-Ceph创建相应的RBD image,成功之后会在SPDK-vhost POD中创建一个SPDK-vhost controller,同时返回结果给到virt-launcher,至此基于SPDK-vhostblock设备创建成功,那么virt-launcher则会正式通知libvirt创建虚机并挂载相应的virtual block设备。

a90238f6032e6349348dc6a86ef84f97.png

5:基于SPDK-vhostKubevirt VM的部署流程

如下图6所示,用户在创建虚机之前,需要在VM yaml文件中申明基于“spdkVhostBlkDisk”类型的块设备,并申请相应的卷容量。

33bee661ab11c2eea46356a66db52edd.png

6:申请SPDK-vhost类型的块设备

性能的对比

我们基于Intel开源的WSF (Workload Service Framework,见下一节)框架搭建一套端到端的全栈式workload来对使用SPDK-vhost的虚拟化IO方案和使用Kubevirt内置virtIO方案做性能对比测试。这里采用的是一套三节点集群的存储超融合环境,部署2副本的Rook-Ceph在该集群中,同时在该集群中均匀的部署3个虚机,每个虚机挂载3个虚拟卷。该workload [3]的具体实现可以参考WSF git仓库中的代码和相应的手册。下面是对于使用Kubevirt内置的virtIO方案和加入SPDK-vhost的方案的性能对比。

f6d6489acac6db5e531c102631319e2b.png

74K 的随机写的吞吐性能和时延对比

8af56f3f3c4ebb65cdc509fd91b16201.png

84k 的随机读的吞吐性能和时延对比

如图7和图8所示,对测试数据做归一化处理,以virtio方案为基准,可以看到vhost方案对于4K的读写场景均有一定程度的性能提升,并且在某些场景中时延也能得到比较大的改善。

c7d473e554f1ba8ebebf01e0a5051829.png

91M Read & Write 带宽性能对比测试

而对比较大的IO,如图9所示,可以看到vhost方案相比原有的virtIO方案在1M的读写场景中也有性能提升,1M顺序读能提升11.52%,而对比1M的顺序写可以得到18.64%的性能提升。

  • WSF 的介绍

WSF 全称Workload Service Framework [1], 是一套Intel开源的面向云原生,端到端的全栈式workload的集成开发,基准测试和调优的平台。该平台支持在不同环境中自动化的系统性的运行并测试workload的性能,目前可以支持在On-Prem和云服务厂商CSP上的实例上部署和性能测试,同时也支持多个硬件平台(比如Intel, AMD, ARM) 的性能对比分析。

WSF 目前支持云原生应用场景中的几个主要的部署类型,如下图所示,其中包括纯Docker部署,Kubernetes的部署和基于Terraform的部署方式。其中Terraform的部署方式能有效的帮助我们将软件栈和workload部署到On-PremCSP 的云实例上。WSF中集成的workload是依据业界内常用的客户应用场景来实现,并对应的定义workload性能KPI测试标准,这不仅能够帮助芯片制造商来分析芯片在各种应用场景下的运行行为和性能状况,也能帮助行业客户在特定平台上部署和调优软件栈和工作负载。

c2f657b16e32ea87072991b10828adf0.png

10WSF 支持的几种部署后端

  • WSF 最新的Release

WSF仓库中包含一系列的完整,独立,可单独执行的workload, 囊括AI,网络,存储,安全等行业类型的软件栈和使用场景。Intel计划会在每个季度做一次workload的发布和更新,最新的一次是23.2的版本[6], 主要更新如下内容:

  • 新增Edge-Ceph-VirtIO workload,workload是针对edge native的应用平台搭建端到端的虚拟化IO方案,以rook-ceph作为超融合块存储后端,基于KubeVirt引入spdk-vhost加速虚机IO性能

  • 新增CM-xAPP-OpenVINO workload,该Workload是基于O-RAN网络架构开发的智能连接管理(CMxApp,使用OpenVINO框架来优化5G用户关联和负载均衡,以提高用户设备(UE)的服务质量(QoS)要求。

  • 新增OpenSSL3 workload,该workload中引入Intel® QuickAssist Technology (Intel® QAT)技术的硬件加速OpenSSL软件栈。

  • 更新NGNIX workload: 升级OpenSSL的版本到OpenSSL3,同时加入Intel® QuickAssist Technology (Intel® QAT) 技术的硬件加速,来提升端到端的RPS整体性能。

参考和引用

  • [1] WSF Repo: https://github.com/intel/workload-services-framework

  • [2] SPDK Vhost的介绍:https://spdk.io/doc/vhost.html

  • [3] Edge-Ceph-Virtio Workload: 代码链接

  • [4] Kubevirt官网:https://kubevirt.io

  • [5] Kubevirt repohttps://github.com/kubevirt/kubevirt

  • [6] WSF V23.02版本:https://github.com/intel/workload-services-framework/tree/23.2

点击“阅读原文”链接,访问WSF对本文中提到的WorkloadSPDK vhost的支持。

作者:张敏,朱永波,杨鼎,WE Team等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人员定位安全管控系统:提升安全管理水平的智能解决方案

在当今社会,人员安全管理成为各行各业关注的焦点。为了保障人员的安全和提高管理效率,人员定位安全管控系统应运而生。 人员定位安全管控系统采用多种定位技术来实现对人员位置的准确定位,如GPS(全球定位系统)、Wi-Fi…

超低输入电压升压电路解决方案

便携式产品一般都采用电池供电,而因为成本和体积方面的考虑,在设计上有减少使用电池数量及体积的趋势。另外,亦因全球能源问题,各种各类的电池使用已备受关注了。当中包括太阳能电池及燃料电池。 而这样就会影响到电源电压比设备所…

Flask的send file和send_from_directory的区别

可以自行查看flask 文档。 send file高效; send from directory安全,且适用于静态资源交互。 都是实现相同的功能的。 send_file send_from_directory

直播回顾 | SDS 容灾方案,让制品数据更安全

7 月 18 日,腾讯云 CODING 与 XSKY星辰天合联合举办了主题为“SDS 容灾方案,让制品数据更安全”的线上研讨会。 来自腾讯云 CODING 的高级解决方案架构师陈钧桐和 XSKY星辰天合金融行业解决方案专家战策,分享了制品管理的困境与需求、腾讯云…

blender 基础材质篇

材质展示 材质背景介绍 什么是PBR? PBR 全称为 Physically Based Rendering,译为基于物理属性的引擎渲染,也就是说会把物质的颜色、粗糙度、高光属性等进行分别处理,使物质体现出更真实的感觉; 什么是BRDF&#xff…

前端工程师的岗位职责(合集)

篇一 岗位职责: 1、负责网站前端开发,实现产品的页面交互及功能实现; 2、与程序开发人员紧密合作,制作前端及后端程序接口标准; 3、完成产品的设计、开发、测试、修改bug等工作,包括业务需求的沟通,功能模块详细设计…

背包问题(一)

题目一 01背包 有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数…

力扣C++|一题多解之数学题专场(2)

目录 50. Pow(x, n) 60. 排列序列 66. 加一 67. 二进制求和 69. x 的平方根 50. Pow(x, n) 实现 pow(x,n),即计算 x 的 n 次幂函数(即x^n)。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000 示例…

听GPT 讲K8s源代码--pkg(八)

k8s项目中 pkg/kubelet/envvars,pkg/kubelet/events,pkg/kubelet/eviction,pkg/kubelet/images,pkg/kubelet/kubeletconfig这些目录都是 kubelet 组件的不同功能模块所在的代码目录。 pkg/kubelet/envvars 目录中包含了与容器运行…

JVM之内存与垃圾回收篇3

文章目录 8 垃圾回收8.1 基本理论8.1.1 对象的finalization机制8.1.2 理解System.gc8.1.3 内存溢出和内存泄漏8.1.4 Stop The World8.1.5 安全点和安全区域8.1.6 Java中的引用 8.2 垃圾回收算法8.2.1 引用计数法8.2.2 可达性分析8.2.2.1 使用MAT查看GC Roots8.2.2.2 使用JProfi…

整车总线系列——FlexRay 四

整车总线系列——FlexRay 四 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能…

Spring使用注解存储Bean对象

文章目录 一. 配置扫描路径二. 使用注解储存Bean对象1. 使用五大类注解储存Bean2. 为什么要有五大类注解?3.4有关获取Bean参数的命名规则 三. 使用方法注解储存Bean对象1. 方法注解储存对象的用法2. Bean的重命名 在前一篇博客中( Spring项目创建与Bean…

nginx 配置 wss加密访问 mqtt

1. 在服务器上部署mqtt服务 2.在宝塔上配置域名证书 3.nginx配置websocket server {listen 80;listen 443 ssl http2;server_name ws-xx.example.com;index index.php index.html index.htm default.php default.htm default.html;root /www/wwwroot/ws-xx.example.com;loca…

服务器量化训练操作说明

Freespace服务器预训练主要步骤: 首先登录堡垒机,命令如下: ssh xxxrelay.baidu-int.com (xxx为个人邮箱前缀) 密码为个人邮箱密码 登录工作机,命令如下: ssh l3yq01-gpu-255-122-22-00.e…

如何在小程序首页隐藏商品分类

​因为在分类页面有显示分类,所以有的商家希望在首页就不显示分类啦。下面就介绍一下如何在首页隐藏商品分类。 在小程序管理员后台->页面设置->首页,显示商品分类设置为否。设置后,在小程序首页商品分类就不会显示啦。注意&#xff1a…

django rest_framework 框架动态设置序列化返回的字段

动态修改字段可以使Django rest框架API像graphQL端点一样,只从模型中检索所需的字段。 一旦序列化器被初始化,就可以使用.fields属性访问序列化器上设置的字段字典。访问和修改此属性允许您动态修改序列化器。 显式地修改fields参数可以帮助您做一些奇…

关于Integer类的一个有趣的面试问题

相信很多人觉得答案是false,false,因为Integer是一个类,把int类型的数据传给Integer类型的数据会创建一个对象,而a,b,c,d作为引用指向的是不同的地址,所以判断相同得到的结果应该是false 但这个想法就正中下怀了&#…

【Spring篇】初识 Spring IoC 与 DI

目录 一. Spring 是什么 ? 二. 何为 IoC ? 三. 如何理解 Spring IoC ? 四. IoC 与 DI 五 . 总结 一. Spring 是什么 ? 我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽ 庞⼤…

探秘Spring中Bean的注解宝典:解读存取Bean的相关注解及用法

目录 存储Bean对象Controller(控制器存储)Service(服务存储)Repository(仓库存储)Component(组件存储)Configuration(配置存储)Bean重命名Bean 获取Bean对象属性注入构造方法注入Setter注入Resource(注入关键字) 存储Bean对象 将对象存储在 Spring 中,有两种注解类…

【Linux】信号保存信号处理

前言:对信号产生的思考 上一篇博客所说的信号产生,最终都要有OS来进行执行,为什么?OS是进程的管理者!信号的处理是否是立即处理的?在合适的时候 -》那什么是合适的时候?信号如图不是被立即处理…