基于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等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop——Windows系统下Hadoop单机环境搭建

为了便于开发,我在本地Windows系统进行Hadoop搭建。 我使用的版本:hadoop-2.7.0。其他版本也可,搭建流程基本一样,所以参考这个教程一般不会有错。 1、下载安装包和插件 安装包hadoop-2.7.0.tar.gz 必要插件winutils-master 2、…

RocketMQ教程-安装和配置

Linux系统安装配置 64位操作系统,推荐 Linux/Unix/macOS 64位 JDK 1.8 Maven3.0 yum 安装jdk8 yum 安装maven 1.下载安装Apache RocketMQ RocketMQ 的安装包分为两种,二进制包和源码包。 点击这里 下载 Apache RocketMQ 5.1.3的源码包。你也可以从这…

详细介绍Matlab中线性规划算法的使用

Matlab中提供了用于线性规划的优化工具箱,其中包含了多种算法,如单纯形法、内点法等。线性规划是一种优化问题,旨在找到一组变量的最佳值,以最大化或最小化线性目标函数,同时满足一组线性约束条件。 下面将详细介绍Ma…

【Spring Boot】事务的隔离级别与事务的传播特性详解:如何在 Spring 中使用事务?不同隔离级别的区别?

文章目录 1 事务1.1 事务简介与 mysql 中的事务使用1.2 Spring 编程式事务(手动操作)1.3 Spring 声明式事务(自动操作)1.4 Transactional 的工作原理 2 事务的隔离级别2.1 事务的四大特性及事务的隔离级别回顾2.2 Spring 事务的隔…

python web开发之WSGI/uwsgi/uWSGI详解

1. 三者的定义 WSGI是一种通信协议。uwsgi是一种传输协议。uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。 2.三者的使用场景 WSGI,全称 Web Server Gateway Interface,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接…

MySQL之索引(入门级讲解)

目录 一.索引的概念 1.1索引的简介 1.2.索引的优缺点 二.MySQL索引语法 2.1查看索引 2.2创建索引 2.2.1 创建表时创建索引 2.2.2存在的表上创建索引 2.3删除索引 三.索引的数据结构 3.1Btree索引 3.2Hash索引 3.4Hash索引和Btree索引的对比 🎁个…

文本预处理——文本张量表示方法

目录 文本张量表示one-hot编码word2vecword embedding 文本张量表示 one-hot编码 word2vec word embedding

代码随想录算法训练营第二十一天 | 读PDF复习环节1

读PDF复习环节1 本博客的内容只是做一个大概的记录,整个PDF看下来,内容上是不如代码随想录网站上的文章全面的,并且PDF中有些地方的描述,是很让我疑惑的,在困扰我很久后,无意间发现,其网站上的讲…

使用rknn-toolkit2把YOLOV5部署到OK3588上

使用rknn-toolkit2把YOLOV5部署到OK3588上 虚拟环境搭建软件包安装在PC机上运行yolov5目标检测 虚拟环境搭建 首先在PC的ubuntu系统安装虚拟环境: 我的服务器是ubuntu18.04版本,所以安装python3.6 conda create -n ok3588 python3.6 需要键盘输入y&…

Python 算法基础篇:插入排序和希尔排序

Python 算法基础篇:插入排序和希尔排序 引言 1. 插入排序算法概述2. 插入排序算法实现实例1:插入排序 3. 希尔排序算法概述4. 希尔排序算法实现实例2:希尔排序 5. 插入排序与希尔排序的对比总结 引言 插入排序和希尔排序是两种常用的排序算法…

Day 61-62 决策树(ID3)

代码: package dl;import java.io.FileReader; import java.util.Arrays; import weka.core.*;/*** The ID3 decision tree inductive algorithm.*/ public class ID3 {/*** The data.*/Instances dataset;/*** Is this dataset pure (only one label)?*/boolean …

结构型模式 - 适配器模式

概述 如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供…

springboot+vue开发后台增删改查

效果图 前端代码【User.vue】 <template><div class"data-container"><!--添加 start--><div class"data-header"><el-button round click"addHander" size"large" type"primary"><el-ic…

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测 目录 区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiLSTM…

uview中的常用的框

第一步&#xff1a; 先下载 uview UI 框架 详见 项目 引入 uView_vue引入uview_qq_2524963996的博客-CSDN博客【代码】 项目 引入 uView。_vue引入uviewhttps://blog.csdn.net/qq_44161703/article/details/131168976?spm1001.2014.3001.5501 第二步&#xff1a; 可以直接…

解锁潜力,驭数赋能:大数据与云计算的强强联合

随着数字化时代的来临&#xff0c;大数据和云计算已成为信息技术领域的两大热门话题。大数据指的是以海量、高速、多样化的数据为基础&#xff0c;通过分析和挖掘来获得有价值的信息和洞察。而云计算则是一种基于网络的计算模式&#xff0c;通过将数据和应用程序存储在云端服务…

【前端动画】科技感扫描效果 css动画animation

扫描出现动画 参考了网友写的二维码扫描 <template><div><div class"scan-content"><img style"width: 2rem;height: 2rem;" src"../../assets/images/eye.png" alt"" /><div class"line">…

Express 框架的基本操作

目录 1、应用生成器 2、基本路由 2.1、在跟路由下配置 GET请求&#xff0c;返回对应相应内容。 2.2、在跟路由下配置 POST请求&#xff0c;返回对应相应内容。 2.3、在跟路由下配置 PUT请求&#xff0c;返回对应相应内容。 2.4、在根路由下配置DELETE请求&#xff0c;返回对…

<Java物联网> 从主动到被动:Java中的BACnet设备属性查询

目录 BACnet 使用软件 资源 模拟器 使用Java主动查 引入maven 创建网络对象 获取远程设备 获取设备属性 使用DeviceEventAdapter订阅 初始化本地BACnet设备和IP网络配置&#xff1a; 启动本地设备和添加监听器&#xff1a; 搜寻远程设备&#xff1a; 发送订阅COV报…