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

news2024/11/25 17:18:11
  • 摘要

本文主要介绍针对云原生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.coloradmin.cn/o/778711.html

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

相关文章

Failed to load response data:No data found for resource with given identifier

前言 关于跨域的另一种解释 前端Ajax访问后端,表单提交,有一个接口报错,其他都没问题 网上看了很多案例方法,均不适用;早上改代码过程中,改好了,话不多说,上原因 原因 提前关闭页…

CentOS7系统下Docker容器基于TensorFlow测试GPU

前言 当基于nvidia gpu开发的docker镜像在实际部署时,需要先安装nvidia docker。安装nvidia docker前需要先安装原生docker compose 1. CentOS7安装docker详细教程 安装docker 1. Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验…

辅助笔记-linux新增硬盘

linux新增硬盘 文章目录 linux新增硬盘步骤1:添加硬盘步骤2:对硬盘进行分区步骤3:对硬盘分区进行格式化步骤4:将硬盘分区挂载到目录上步骤5:设置“永久挂载” 本文主要参考B站视频“P59_韩顺平Linux_增加磁盘应用实例”…

IDEA: 将第三方依赖打入jar包

文章目录 一、添加自定义的jar包到lib目录下二、将自定义依赖包打入jar包方式1、使用springboot自带的插件 一、添加自定义的jar包到lib目录下 参考往期文章:IDEA中Java项目创建lib目录(添加依赖jar包代替maven依赖) 二、将自定义依赖包打入jar包 方式1、使用spr…

centos7下载mysql5.7,jdk1.8

前言:最近公司服务器从阿里云换到腾讯云了(为了省钱啧啧),所以这个相关环境的配置工作,由我来负责了。 1.Mysql 1.下载 第一步: rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11…

【算法基础:数学知识】4.4 快速幂

文章目录 快速幂例题列表875. 快速幂⭐⭐⭐⭐⭐(重要!)代码写法1——递归代码写法2——迭代递归写法 与 迭代写法的 对比 876. 快速幂求逆元🚹(需要理解逆元的概念)TODO乘法逆元介绍解法代码 快速幂 https…

python机器学习(三)特征预处理、鸢尾花案例--分类、线性回归、代价函数、梯度下降法、使用numpy、sklearn实现一元线性回归

K-近邻算法(K-Nearest Neighboor) 特征预处理 数据预处理的过程。数据存在不同的量纲、数据中存在离群值,需要稳定的转换数据,处理好的数据才能更好的去训练模型,减少误差的出现。 标准化 数据集的标准化对scikit-learn中实现的大多数机器…

WPF实战项目十(API篇):引入工作单元UnitOfWork

1、通过github地址:https://github.com/arch/UnitOfWork,下载UnitOfWork的代码,将工作单元部分的代码引用到自己的项目,新增UnitOfWork文件夹。 2、在UnitOfWork文件夹下引用UnitOfWork下的IPagedList.cs、PagedList.cs类&#xf…

探索物联网HMI的端口转发和NAT功能

前言 端口转发和NAT功能常用于内网穿透,实现内部网络和外部网络之间的数据传输,工作人员通过外部网络便可安全访问到内网设备,实现设备的状态监测。接下来小编将为大家介绍支持端口转发和NAT功能的虹科物联网HMI是如何帮助用户实现内网穿透。…

(css)自定义登录弹窗页面

(css)自定义登录弹窗页面 效果&#xff1a; 代码&#xff1a; <!-- 登录弹窗 --> <el-dialog:visible.sync"dialogVisible"title"用户登录"width"25%"centerclass"custom-dialog":show-close"false":close-on-cli…

uniapp 条件编译

// #ifdef %PLATFORM%仅在某平台存在&#xff1b;%PLATFORM%为平台名称// #ifndef %PLATFORM%除了某平台均存在&#xff1b;// #endifendif 一定要搭配使用%PLATFORM%&#xff1a; VUE3 HBuilderX 3.2.0 详情 APP-PLUS App APP-PLUS-NVUE或APP-NVUE App nvue 页面 APP-ANDRO…

Redis八股学习记录1Redis面试常问问题from小林coding

Redis八股学习记录1Redis简介与数据结构from小林coding Redis简介Redis数据结构String底层实现List底层实现Hash底层实现Set底层实现Zset Redis线程模型Redis持久化AOF日志的实现AOF日志重写机制 RDB快照实现混合持久化Redis集群主从复制哨兵模式切片集群模式Redis的集群脑裂问…

【C++初阶】仿函数和priority_queue的模拟实现(附源码)

一.仿函数 仿函数&#xff0c;顾名思义就是模仿函数&#xff0c;它其实是一个类&#xff0c;类里面重载了运算符&#xff08;&#xff09;&#xff0c;在调用这个重载的运算符时&#xff0c;让我们感觉是调用函数一样&#xff0c;可以说相当于C语言里的函数指针一样&#xff0c…

Jenkins环境配置篇-邮件发送

作为持续集成的利器Jenkins已经得到了广泛地应用&#xff0c;仅仅作为一个工具&#xff0c;Jenkins已然有了自己的生态圈&#xff0c;支持其的plugin更是超过1300。在实际中如何使用以及如何更好地使用jenkins&#xff0c;一直是大家在实践并讨论的。本系列文章将会从如何使用j…

视频拼接得AI三维生成方案-开端(一)

想使用二维得图像生成三维得空间图像&#xff0c;英伟达有完整得方案&#xff0c;开源&#xff0c;但是三维拼接不一样&#xff0c;只需要二维&#xff0c;并且要实时&#xff0c;如何生成是我每天都在思考得东西。 cnn 提取特征器和自编码 在训练细胞神经网络时&#xff0c;问…

【C++】多态案例— —计算器类

author&#xff1a;&Calton tag&#xff1a;C topic&#xff1a;【C】多态案例— —计算器类 website&#xff1a;黑马程序员C date&#xff1a;2023年7月23日 目录 多态概要 案例实现 原理剖析 多态概要 多态是C三大特性之一&#xff08;封装、继承、多态&#xff…

FreeRTOS源码分析-5 系统延时详解

目录 1 系统延时API详解 2 相对延时与绝对延时的区别 3 相对延时与绝对延时的应用 4 系统延时函数实现原理 4.1 vTaskDelay业务流程 4.2 vTaskDelayUntil业务流程 5 任务挂起/任务恢复详解 1 系统延时API详解 TickType_t 实际上是uint32_t类型 2 相对延时与绝对延时的区…

MATLAB | 绘制scatter散点图时如何自动标注超范围散点?

本文来讲一下如何自动标注超出坐标区域范围的点&#xff0c;例如这样&#xff1a; 如图右侧的红叉代表横坐标超过范围的点的纵坐标 &#xff0c;当然下方的红叉代表纵坐标超过范围点的横坐标。 本文使用的自己编写的工具函数scatterOOR将被放在文末&#xff0c;先讲讲咋用哈&a…

【算法基础:搜索与图论】3.3 拓扑排序

文章目录 拓扑排序介绍如何构造拓扑排序&#xff08;⭐重要&#xff01;&#xff09; 例题&#xff1a;848. 有向图的拓扑序列BFS 写法构造拓扑排序 相关题目练习207. 课程表&#xff08;判断是否存在拓扑序列&#xff09;bfs 写法dfs 写法 210. 课程表 II&#xff08;找到一个…

Packet Tracer – 实施静态 NAT 和动态 NAT

Packet Tracer – 实施静态 NAT 和动态 NAT 拓扑图 目标 第 1 部分&#xff1a;利用 PAT 配置动态 NAT 第 2 部分&#xff1a;配置静态 NAT 第 3 部分&#xff1a;验证 NAT 实施 第 1 部分&#xff1a; 利用 PAT 配置动态 NAT 步骤 1&#xff1a; 配置允许用于 NAT …