SPDK vhost介绍

目录

  • 1. vhost技术的背景与动机
    • Virtio 介绍
      • virtio-blk数据路径为例
  • 2. vhost技术的核心原理
    • 2.1 vhost-kernel
    • 2.2 vhost-user
      • 举例
    • 2.3 SPDK vhost
    • vhost的优势
      • IO请求处理
      • 数据传输
      • 控制链路调整
  • 3. SPDK vhost的实现与配置
    • 3.1 环境准备
    • 3.2 启动SPDK vhost服务
    • 3.3 创建虚拟块设备
    • 3.4 创建vhost设备
    • 3.5 配置QEMU
  • 4. SPDK vhost的优势
  • vhost的限制
    • 虚拟机内存
    • 磁盘限速
    • 迁移
  • 参考

vhost技术:加速虚拟化I/O的利器在虚拟化环境中,虚拟机(VM)的I/O性能一直是影响系统性能的关键因素之一。传统的I/O虚拟化方案往往存在性能瓶颈,尤其是在处理高负载的存储I/O时。为了突破这些限制,vhost技术应运而生。

1. vhost技术的背景与动机

在虚拟化环境中,虚拟机通过虚拟设备与宿主机的物理设备进行通信。传统的I/O虚拟化方案主要有以下几种:

  • 纯软件模拟:通过软件完全模拟设备,性能较差,但兼容性好。
  • 半虚拟化(Para-Virtualization):通过在虚拟机中安装特定的驱动程序(如virtio驱动),与宿主机的后端进行通信,性能优于纯软件模拟。
  • 硬件虚拟化:如SR-IOV和VT-D,直接将物理设备或其虚拟功能(VF)分配给虚拟机,性能最高,但对硬件和操作系统支持要求较高。

在这里插入图片描述

然而,即使是半虚拟化的virtio方案,也存在一些性能瓶颈。例如,当虚拟机向宿主机提交I/O请求时,需要通过PCI配置空间通知宿主机,这会导致VM_EXIT事件,增加CPU上下文切换的开销。此外,数据在用户态和内核态之间的复制也会降低性能。

Virtio 介绍

Virtio 基于 Vring 的 I/O 通讯机制,相比 QEMU 的纯软件模拟,有效降低了 I/O 延迟,具有性能优势。
Virtio的引入,也开始让不同厂商的半虚拟化IO设备的实现方式趋于统一。

Virtio 由三部分组成:

  • 前端是驱动层,位于 Guest 系统内部
  • 中间是虚拟队列(virtqueue),负责数据传输和命令交互
  • 后端设备层,用于具体处理 Guest 发送的请求。

在这里插入图片描述

virtio-blk数据路径为例

在这里插入图片描述

  1. Guest 发起 I/O 操作,Guest 内核 Virtio 驱动写 PCI 配置空间,触发 VM EXIT,返回到 Host KVM 中(通知 KVM);
  2. QEMU 的 vCPU 线程从 KVM 内核态回到 QEMU,让 QEMU Device 来处理 Virtio Vring 请求;
  3. QEMU 通过 iSCSI Drive 发起存储连接(iscsi over tcp to localhost);
  4. 通过 Socket 将请求连接到存储进程提供的 iSCSI Target;
  5. 存储引擎接收请求并进行 I/O 处理;
  6. 存储引擎发起对本地存储介质的 I/O;
  7. I/O 操作结束,通过上述逆过程返回至 Virtio 后端 Device,QEMU 会向模拟的 PCI 发送中断通知,从而 Guest 基于该中断完成整个 I/O 流程。

下图的讲解更加详细(基于SmartX ZBS),但内容是一致的:
在这里插入图片描述

数据流从用户态到内核态再到用户态。

2. vhost技术的核心原理

如前所述,Virtio 后端 Device 用于具体处理 Guest 的请求,负责 I/O 的响应,把 I/O 处理模块放在 QEMU 进程之外,并将其放到用户态或内核态的后端进程中,从而减少了上下文切换和数据拷贝的开销。
这种实现的方案称为 vhost。

vhost技术的核心在于优化虚拟机与宿主机之间的I/O通信路径。它通过以下几种方式实现性能提升:

2.1 vhost-kernel

vhost-kernel是vhost技术的早期实现,将I/O处理逻辑放到Linux内核中。它通过内核模块直接处理虚拟机的I/O请求,减少了用户态到内核态的上下文切换。然而,尽管vhost-kernel优化了数据处理路径,但虚拟机仍然需要通过PCI配置空间通知宿主机,这仍然会导致VM_EXIT事件。

2.2 vhost-user

vhost-user是vhost技术的另一种实现方式,将I/O处理逻辑完全放到用户态进程中。与vhost-kernel相比,vhost-user通过轮询机制检测I/O请求,避免了虚拟机更新PCI配置空间的需要,从而消除了VM_EXIT事件。此外,vhost-user还支持零拷贝技术,进一步减少了数据拷贝的开销。

举例

在这里插入图片描述

  1. 当 Guest 发起 I/O 操作后,存储软件通过 Polling 机制感知新的请求动作,从 virtqueue 获取数据;
  2. 存储引擎接收请求并进行 I/O 处理;
  3. 存储引擎发起对本地存储介质的 I/O;
  4. I/O 操作完成后,由 vhost device 发送 irqfd(eventfd)通知到 KVM;
  5. KVM 注入中断通知 Guest OS 完成 I/O。

下图的讲解更加详细(基于SmartX ZBS),但内容是一致的:
在这里插入图片描述

整个过程,绕开QEMU,存储可以直接处理IO请求。

2.3 SPDK vhost

SPDK是一个高性能的存储开发工具包,它通过用户态编程和轮询机制实现了高效的I/O处理。SPDK vhost是基于vhost-user技术的进一步优化,它结合了SPDK的高性能存储后端(如NVMe、malloc ramdisk等),提供了极致的I/O性能。

vhost的优势

IO请求处理

开启vhost之前的IO:Guest OS -> QEMU -> Storage -> QEMU -> KVM -> Guest OS
开启vhost之后的IO:Guest OS -> Storage -> KVM -> Guest OS

通过 vhost-user target 来直接处理 IO 请求,不再需要 QEMU 的参与,绕开了由 QEMU 处理 IO 请求的线程资源有限所造成的瓶颈

数据传输

未启用vhost。在原有的 IO 路径下,数据需要经过 iSCSI 协议的封装而后通过 TCP 完成 QEMU 和 Chunk 之间的传输,在这个过程中,有两个方面造成了数据写入的性能损耗:

  • iSCSI over TCP 模式在本地网络协议栈传输存在性能衰减
  • 使用 iSCSI 协议造成的封装开销

启用vhost,由于其共享内存,Storage和Guest OS直接共享数据,不依靠iSCSI传输数据。

控制链路调整

3. SPDK vhost的实现与配置

SPDK vhost支持多种虚拟化设备,包括vhost-scsi和vhost-blk。以下是一个典型的SPDK vhost配置和使用流程:

3.1 环境准备

安装SPDK:根据SPDK的官方文档,编译并安装SPDK。
配置hugepages:SPDK需要使用hugepages来分配大页内存,以减少内存碎片和提高性能。例如,可以使用以下命令分配4GiB的hugepages:

HUGEMEM=4096 scripts/setup.sh

3.2 启动SPDK vhost服务

启动SPDK vhost服务时,需要指定CPU核心和socket路径。例如,以下命令在CPU核心0和1上启动vhost服务,并将socket文件放在/var/tmp目录下:

build/bin/vhost -S /var/tmp -m 0x3

3.3 创建虚拟块设备

SPDK支持多种存储后端,包括NVMe、malloc ramdisk和Linux AIO等。以下命令创建一个64MB的malloc ramdisk块设备:

scripts/rpc.py bdev_malloc_create 64 512 -b Malloc0

3.4 创建vhost设备

接下来,创建一个vhost-scsi控制器,并将其与malloc块设备绑定:

scripts/rpc.py vhost_create_scsi_controller --cpumask 0x1 vhost.0
scripts/rpc.py vhost_scsi_controller_add_target vhost.0 0 Malloc0

3.5 配置QEMU

最后,启动虚拟机并连接到SPDK vhost设备。以下是一个示例QEMU命令:

qemu-system-x86_64 \--enable-kvm \-cpu host -smp 2 \-m 1G -object memory-backend-file,id=mem0,size=1G,mem-path=/dev/hugepages,share=on -numa node,memdev=mem0 \-drive file=guest_os_image.qcow2,if=none,id=disk \-device ide-hd,drive=disk,bootindex=0 \-chardev socket,id=spdk_vhost_scsi0,path=/var/tmp/vhost.0 \-device vhost-user-scsi-pci,id=scsi0,chardev=spdk_vhost_scsi0,num_queues=2

4. SPDK vhost的优势

SPDK vhost通过以下方式显著提升了虚拟化环境中的I/O性能:
零拷贝技术:通过内存共享和轮询机制,消除了数据在用户态和内核态之间的拷贝。
减少上下文切换:通过轮询机制避免了虚拟机更新PCI配置空间的需要,减少了VM_EXIT事件。
高性能存储后端:结合SPDK的高性能存储后端(如NVMe),提供了极致的I/O性能。
灵活的配置:支持多种存储后端和虚拟化设备,适用于不同的应用场景。

vhost的限制

虚拟机内存

vhost-user 的共享内存机制对 VM 的运行有两个要求:

  • Huge page(大页内存),提供给 VM 的内存不再是普通的内存,而是 Huge page 模式;
  • 完全预留,VM 使用的内存在运行时需要全部分配并始终独占,不支持 VM 内存超分。

磁盘限速

一开始的QOS基于QEMU,由于启用后不再经过qemu,所以仅支持存储端的磁盘限速

迁移

不支持 开启与没开启的集群之间 热迁移

参考

SPDK: vhost Target

SPDK Vhost-user 如何帮助超融合架构实现 I/O 存储性能提升

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

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

相关文章

GPU 编程系列:内核网格与多维数据处理

GPU 编程系列:内核网格与多维数据处理 大家好,欢迎来到 GPU 编程系列的第三集!在这一集中,我们将深入探讨内核网格的概念,并展示如何利用多维网格来处理复杂的数据结构。 3 内核网格的基础 在上期节目中,…

电容的一些常用数值

如果是滤高频信号的小电容一般采用100nF 如果是滤低频信号的大电容一般采用10uF(10000nF) 比如这个LDO降压 两个一起用滤波效果会更好 如果想要供电引脚悬空,按理不能悬空,所以应该接大电阻接地,一般采用5.1KΩ 比如这个6Pin USB-TypeC的…

Apache Flink 概述学习笔记

一、引言 在大数据处理领域,Apache Flink 是一个极具影响力的开源流批一体化计算框架,它以其独特的架构和强大的功能,为大规模数据处理提供了高效、灵活的解决方案。 二、基本概念 Flink 是什么:Flink 是一个分布式流批处理框架…

Java面向对象专题

面向过程和面向对象的区别 面向过程:当事件比较简单的时候,利用面向过程,注重的是事件的具体的步骤/过程,注重的是过程中的具体的行为,以函数为最小单位,考虑怎么做。 面向对象:注重找“参与者”,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑…

业余无线电 对讲机常用频率使用

我自己的总结是,基本可以无忧使用: 144.035-145.800 146.000-148.000 430.000-431.900 432.240-435.000 438.000-439.000 50Mhz一般手台不支持,暂不记录。 以下为附录可以自行阅读,本文内容如有错误请留言指正。 特定波段…

linux 扩容

tmpfs tmpfs 82M 0 82M 0% /run/user/1002 tmpfs tmpfs 82M 0 82M 0% /run/user/0 [输入命令]# fdisk -lu Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors Units: sectors of 1 * 512 512 bytes Sector size (logi…

一个基于Python+Appium的手机自动化项目~~

本项目通过PythonAppium实现了抖音手机店铺的自动化询价,可以直接输出excel,并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode: 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目,实现了…

VMware虚拟机迁移到阿里云

VMware虚拟机迁移到阿里云是一个涉及多个步骤的过程,具体如下: 使用阿里云的服务器迁移中心(SMC)进行P2V或V2V迁移。如果是小型应用,可以通过制作镜像文件然后上传至阿里云OSS,并基于该镜像创建ECS实例。对…

(回溯分割)leetcode93 复原IP地址

#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; //卡尔的图不是按照程序执行过程而是直接画程序会执行的过程 // 实际执行是&#xff1a;n个字符&#xff0c;递推n1后&#xff08;叶子节点&#xff…

张一鸣从创业之初到现在的231句话

1.人常会不自觉地记下对自己有利的部分&#xff0c;这是形成委屈的重要原因。 2.延迟满足感程度在不同量级的人是没法有效讨论问题的&#xff0c;因为他们愿意触探停留的深度不一样。 3.做不好的就别做了&#xff0c;要做就必须做到非常好。 4.当感到沟通困难的时候&#xf…

2025年1月23日-知道自己在哪儿,知道自己在路上

在哪里&#xff1f;在路上&#xff1f; 想写一写的时候&#xff0c;就突然想写一写。 一些事情&#xff0c;一些在路上的事情&#xff0c;一些知道自己在路上的事情。 元旦过后&#xff0c;市场一路阴跌&#xff1b;牛市多长阴&#xff0c;一根大阴线配合小反弹&#xff0c;…

分子动力学模拟里的术语:leap-frog蛙跳算法和‌Velocity-Verlet算法

分子动力学模拟&#xff08;Molecular Dynamics Simulation&#xff0c;简称MD&#xff09;是一种基于经典力学原理的计算物理方法&#xff0c;用于模拟原子和分子在给定时间内的运动和相互作用‌。以下是关于分子动力学模拟的一些核心术语和概念&#xff1a; ‌定义系统‌&am…

JS-Web API -day03

一、事件流 1.1 事件流与两个阶段说明 事件流 指的是事件完整执行过程中的流动路径 假设页面有个div标签&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 捕获阶段&#xff1a;Document - Element html - Elementbody - Element div…

国产低功耗带LCD驱动和触摸按键功能的MCU

以下是国产低功耗、集成LCD驱动和触摸按键功能的MCU精选型号及其核心特性&#xff0c;结合性能、功耗和适用场景进行综合推荐&#xff1a; 1.灵动微MM32L0130系列 257 核心特性&#xff1a;低功耗&#xff1a;待机模式功耗低至100nA&#xff0c;支持多种低功耗模式。 LCD驱动&a…

智能工厂数字化化集成落地项目(交付版 67页)PPT 解读

基于工业4.0和工业智能化转型的甲方智能工厂数字化集成落地项目。报告分析了制造业的发展趋势&#xff0c;重点介绍了甲方为应对挑战而实施的商业模式创新和产业升级策略。通过引入乙方的智能工厂规划&#xff0c;构建了一个集成的数字化工厂架构&#xff0c;以提高生产效率和响…

Linux进度条实现

Linux进度条实现 1.\r\n2.缓冲区3.缓冲区分类4.进度条实现 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f4dd;本篇内容&#xff1a;\…

基于java线程池和EasyExcel实现数据异步导入

基于java线程池和EasyExcel实现数据异步导入 2.代码实现 2.1 controller层 PostMapping("import")public void importExcel(MultipartFile file) throws IOException {importService.importExcelAsync(file);}2.2 service层 Resource private SalariesListener sa…

(15)Chainlink Automation(定时任务) 详细介绍及用法

Chainlink Automation 详细介绍 1. 什么是 Chainlink Automation&#xff1f; Chainlink Automation 是 Chainlink 提供的一个去中心化服务&#xff0c;专门用于自动化执行智能合约的链上操作。它允许开发者基于时间或特定条件&#xff08;如链上或链下事件&#xff09;触发智…

校验收货地址是否超出配送范围实战3(day09)

优化用户下单功能&#xff0c;加入校验逻辑&#xff0c;如果用户的收货地址距离商家门店超出配送范围&#xff08;配送范围为5公里内&#xff09;&#xff0c;则下单失败。 提示&#xff1a; ​ 1. 基于百度地图开放平台实现&#xff08;https://lbsyun.baidu.com/&#xff09…

Linux系统下速通stm32的clion开发环境配置

陆陆续续搞这个已经很久了。 因为自己新电脑是linux系统无法使用keil&#xff0c;一开始想使用vscode里的eide但感觉不太好用&#xff1b;后面想直接使用cudeide但又不想妥协&#xff0c;想趁着这个机会把linux上的其他单片机开发配置也搞明白&#xff1b;而且非常想搞懂cmake…