虚拟化技术 — VirtIO 虚拟设备接口标准

news2024/11/23 13:43:43

目录

文章目录

  • 目录
  • VirtIO
  • VirtIO 虚拟设备接口标准
    • VirtIO 的前后端分层架构标准
    • VirtIO 的数控路径分离架构标准
    • VirtIO 的传输层标准
  • VirtIO 标准在 Linux 中的实现

VirtIO

VirtIO 由 Rusty Russell 开发,最初是为了支持自己开发的 lguest Hypervisor,其设计目标是在虚拟化环境下提供与物理设备相近的 I/O 功能和性能,并且避免在虚拟机中安装额外的驱动程序。基于这一目标,后来通过开源的方式将 VirtIO 延伸为一种虚拟化设备接口标准,并广泛的支持 KVM、QEMU、Xen 和 VMware 等虚拟化解决方案。

为了追求更高的性能和更低的开销表现,VirtIO 采用了 Para-virtualizaiton(半虚拟化/准虚拟化)技术路线,本质区别于性能低下的 Full-virtualizaiton(e.g. QEMU I/O Emulation)。这也意味着使用 VirtIO 的 GuestOS 需要经过一定的代码修改(安装非原生的 Device Driver),这也是为什么需要将 VirtIO 定位于 “虚拟化设备接口标准“ 的原因,其整体的集成架构需要由 Front-end(GuestOS Kernel Device Driver)和 Back-end(VMM Provider)共同遵守统一的传输协议。

在这里插入图片描述

在应用 VirtIO 的场景中,除了 GuestOS 需要安装额外的 VirtIO Front-end Device Driver 这一点不足之外(通常在制作 QCOW2 镜像时会安装好),相对的带来了下列诸多好处:

  1. 高性能:VirtIO 省去了 Full-virtualizaiton 模式下的 Traps(操作捕获)环节,GuestOS 通过 VirtIO Interfaces 可以直接与 Hypervisor 中的 Device Emulation 进行交互。
  2. 低开销:VirtIO 优化了 CPU 在内核态和用户态之间频繁切换,以及 CPU 在 VM Exit 和 VM Entry 之间频繁陷入陷出所带来的性能开销。
  3. 标准化:VirtIO 实现了统一的虚拟设备接口标准,可以应用在多种虚拟化解决方案中。

在这里插入图片描述

VirtIO 虚拟设备接口标准

为了抑制 Para-virtualizaiton 所具有的跨平台兼容性缺点,VirtIO 明智的走上了开源之路,通过构建标准而统一的生态来争取最小化的兼容性排斥问题,反而让其逆转成为了一种优势。

在 VirtIO 提出的虚拟化设备接口标准中,包括多个子系统,每个子系统都定义了一组虚拟设备类型和协议。例如:

  • VirtIO-Block(块设备):提供虚拟磁盘设备的接口。
  • VirtIO-Net(网络设备):提供虚拟网络设备的接口。
  • VirtIO-Serial(串口设备):提供虚拟串口设备的接口。
  • VirtIO-Memory(内存设备):提供虚拟内存设备的接口。
  • VirtIO-Input(输入设备):提供虚拟输入设备的接口。

此外还有 VirtIO-SCSI、VirtIO-NVMe、VirtIO-GPU、VirtIO-FS、VirtIO-VSock 等等虚拟设备类型和协议。

VirtIO 的前后端分层架构标准

VirtIO 虚拟设备接口标准的分层软件架构如下图所示:

  • Front-end:是一组通用的,安装在 GuestOS Kernel 中的 VirtIO Device Driver,通过 Hyper-call 的方式对 Back-end 进行调用。
  • Back-end:是一组 Hypervisor 专用的,运行在 VMM 中的设备模拟程序,提供了 Hyper-call 调用接口。
  • Transport:是一组标准的传输层接口,基于环形队列的方式来批量处理 I/O 请求。

在这里插入图片描述

VirtIO 的数控路径分离架构标准

VirtIO 还定义了 “控制路径” 和 “数据路径” 的分离架构,两者的侧重各有不同,控制平面追求尽可能的灵活以兼容不用的设备和厂商,而数据平面则追求由更高的转发效率以快速的交换数据包。

  • 控制路径:控制建立或删除 Front-end 和 Back-end 之间的数据路径,提供可管理的灵活性。
  • 数据路径:在 Front-end 和 Back-end 之间进行数据传输,追求性能。

对应的,VirtIO 标准也可以分为两个部分:

  • VirtIO Spec:定义了如何在 Front-end 和 Back-end 之间构建控制路径和数据路径的标准,例如:数据路径规定采用环形队列缓冲区布局。
  • Vhost Protocol:定义了如何降数据路径的高性能实现标准,例如:基于 Kernel、DPDK、SmartNIC Offloading 的实现方式。

以 QEMU 为例,其根据 VirtIO Spec 实现了控制路径,而数据路径则可以 Bypass QEMU,使用 vhost-net、vhost-user 等实现。

VirtIO 的传输层标准

VirtIO 的传输层标准称之为 Virtqueues。以 QEMU VirtIO-Net 为例,对于一个虚拟网卡设备而言,采用了非常类似于物理网卡设备(NIC Rx/Tx Queues 和 Kernel Rx/Tx Rings)的设计思路。

Front-end 和 Back-end 之间存在 2 个 Virtqueues,对应到 NIC 的 Rx/Tx Queues。Virtqueues 的底层利用了 IPC 共享内存技术,在 HostOS 和 GuestOS 之间建立直接的传输通道,绕开了 VMM 的低效处理。

  1. Receive Queue:是一块 Buffer 内存空间,存放具体的由 Back-end 发送到 Front-end 数据。
  2. Send Queue:是一块 Buffer 内存空间,存放具体的由 Front-end 发送到 Back-end 数据。

同时,每个 Virtqueue 都具有 2 个 Vrings,对应到 Kernel 的 Rx/Tx Rings:

  1. Available Ring:存放 Front-end 向 Back-end 发送的 Queue 中可用的 Buffer 内存地址。
  2. Used Ring:存放 Back-end 向 Front-end 发送的 Queue 中已使用的 Buffer 内存地址。

当然,Front-end 和 Back-end 之间还需要一种双向通知机制,对应到 NIC 和 CPU 之间的硬中断信号:

  1. Available Buffer Notification:Front-end 使用此信号通知 Back-end 存在待处理的缓冲区。
  2. Used Buffer Notification:Back-end 使用此信号标志已完成处理某些缓冲区。

具体的,当 GuestOS 发送数据时,Front-end 将数据填充到 Send Queue 内存空间,然后将地址记录到 Available Ring,并在适当的时候向 Back-end 发送 Available Buffer Notification;QEMU 接收到通知后,从 Available Ring 中获取到数据的数据,完成数据接收,然后记录 New Buffer Head Index 到 Used Ring,并在适当的时候向 Front-end 发送一个 Used Buffer Notification。Front-end 接收到通知后释放对应的 Send Queue 内存空间,Available Ring 指针指向下一位。

当 GuestOS 接收数据时,Front-end 首先分配好 NULL 的 Receive Queue 内存空间,然后将地址记录到 Available Ring,并在适当的时候向 Back-end 发送 Available Buffer Notification;QEMU 接收到通知后,从 Available Ring 中获取到数据填充入口地址,完成数据填充,然后记录 New Buffer Head Index 到 Used Ring,并在适当的时候向 Front-end 发送一个 Used Buffer Notification。Front-end 接收到通知后从 Receive Queue 中读取数据,Available Ring 指针指向下一位。

值得注意的是,在 PCI Passthrough 场景中,可以使用 virtio-pci(更多的是使用 VFIO)。虽然此时依旧会沿用了 Available/Used buffer notification 这一控制面的双向通知机制,但实际的数据面,则是由 DMA 和专用队列来完成的,具有更高的性能。这体现了数控分离带来的好处。

在这里插入图片描述

VirtIO 标准在 Linux 中的实现

在连接了 VirtIO 虚拟设备接口标准中,前后端分层(横向)、数控路径分离(纵向)架构之后,再回头看 VirtIO 在 Linux 中的具体实现方式。如下图所示:

  1. 驱动层(Front-end):安装到 GuestOS Kernel 中的各种 I/O 设备的驱动程序。例如:virtio-net、virtio-blk。

  2. 传输层:定义了控制面和数据面的传输标准,例如:vhost-net(Kernel)、vhost-user(DPDK)、virtio-pci(PCI、PCIe)。

    1. 控制平面通信层(virtio):用于 Front-end 与 Back-end 之间进行控制信令的交换和协商(数据结构、Notify 等通信机制),如上述 Vings,控制数据平面的建立/关闭。
    2. 数据平面通信层(Transport):用于 Front-end 与 Back-end 之间进行数据交换,如上述 Virtqueues。
  3. 设备层(Back-end):运行在后端 Hypervisor 上的设备模拟程序,或是一个真实的硬件设备。

在这里插入图片描述

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

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

相关文章

对象存储之SeaweedFS简介及与MinIO的对比

什么是SeaweedFS? SeaweedFS架构: master service【主服务】和Volume service【卷服务】一起提供分布式对象存储服务,支持用户配置数据的复制和冗余策略。可选的Filer service【过滤器】和S3 service【S3服务】是对象存储之上的附加层&#x…

量子力学 学习

对于同一个竖直向上量子比特,不对他进行任何的干扰,进行第一次水平测试实验会随机得到一个一或者负一,之后再进行多少次水平测试实验都与第一次的试验结果是相同的。 我们换用其他的竖直向上量子比特,或者对原来的量子比特进行干扰…

高阶函数的面试

说说JS原型和原型链 原型:函数都有prototype(显示原型)属性,而prototype会自动初始化一个空对象,这个对象就是原型对象 原型对象中会有一个constructor属性,这个属性将指向了函数本身 实例化对象都有一个_proto_(隐式原型)属性&#xff0c…

Spring基于注解读取和存储对象

目录 一. 存储 Bean 对象 1. 前置工作:配置扫描路径 2. 使用五大类注解存储Bean对象 Controller 命名规则 Service Repository Compoent Configuration 五大类注解之间的关系 3. 使用方法注解存储Bean对象 二. 获取 Bean 对象 1. 属性注入 优点分析 缺…

详解C语言string.h中常用的14个库函数(二)

本篇博客继续讲解string.h中的库函数。在上一篇博客中,我介绍了strlen, strcpy, strcat, strcmp这4个字符串操作函数,本篇博客会继续介绍strncpy, strncat, strncmp这3个类似的函数。 strcpy, strcat, strcmp这3个函数是长度不受限制的字符串操作函数&a…

预算约束下营销效果优化的端到端框架(快手)

目录 翻译:预算约束下营销效果优化的端到端框架 1介绍 2 .相关工作 2.1预算分配 2.2梯度估计 3我们的端到端框架 3.1符号 ​3.2两阶段范式 3.3 Marketing Goal as a Regularizer 3.4梯度估计 ​3.5训练 4实验结果 4.1数据集 4.2评价指标 4.3实现细节 …

Windows环境下NVM安装后Node/NPM命令无法使用

问题:Windows环境下安装nvm后,使用nvm安装node,无法使用node相关命令。 解决方案:注意安装的时候有两个路径,第一个是nvm所在的路径,第二个是nodejs所在的路径,大家需要在对应的目录下找到路径…

基于SSM的电影订票管理系统

有需要请私信或看评论链接哦 可远程调试 基于SSM的电影订票管理系统 一 介绍 基于SSM的电影订票管理系统,本项目分为前台和后台,登录角色分为普通用户和管理员。用户可注册登录,个人中心,搜索电影,选座购票&#xff…

机器学习——损失函数(lossfunction)

问:非监督式机器学习算法使用样本集中的标签构建损失函数。 答:错误。非监督式机器学习算法不使用样本集中的标签构建损失函数。这是因为非监督式学习算法的目的是在没有标签的情况下发现数据集中的特定结构和模式,因此它们依赖于不同于监督…

QMS-云质说质量 - 5 解决中小企业质量问题的钥匙在哪里?

云质QMS原创 转载请注明来源 作者:王洪石 引言 一个小小的质量问题可能引发蝴蝶效应 日常生活中,我们每天都会遇到各种各样的问题,并随着它们喜怒哀乐。企业也不例外,即使有很好的管理体系以及非常高素质的员工,一些错…

XGBoost模型详解

1.什么是XGBoost? GBDT,它是一种基于boosting增强策略的加法模型,训练的时候采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t − 1 t-1 t−1 棵树的预测结果与训练样本真实值的残差。XGBoost对GBDT进行了一…

C/C++每日一练(20230424)

目录 1. 只出现一次的数字 🌟 2. 有效的括号 🌟🌟 3. 递归反序正整数 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 只出现一次…

《站在巨人的肩膀上学习Java》

Java从诞生距今已经有28年了,在这段时间里,随着Java版本的不断迭代,Java新特性的不断出现,使得Java被使用的越来越广泛。在工程界Java语言一直是大家最喜欢的语言之一,Java一直排行在编程语言热门程度的前3名。 可想而…

ora_scm0导致主机负载高

今天不知道了,几个12.2 RAC出问题,有现场反馈主机负载高,之前连接过该环境,知道是12.2环境,直接top查看,发现ora_scm0经常cpu使用率100%了,查看hydb1主机负载正常 直接上mos文档 12.2 RAC DB B…

字节和阿里,谁的管理模式更先进?

有人说,字节跳动的成功,是商业模式和管理模式的成功。不无道理,相比阿里巴巴以KPI绩效考核、强制淘汰的组织管理模式来说,字节的模式有其先进的地方。 在商业模式上,字节用算法的方式,10倍速地提升了信息分…

2023.04.24 c++第六讲

作业&#xff1a; 1. 手动实现顺序栈&#xff0c;要求实现数据结构中&#xff0c;所有栈的相关操作 #include <iostream> #define MAXSIZE 20 //宏定义&#xff0c;栈的最大容量 using namespace std;template <typename T> class stacklink { pri…

ESXi8.0安装Windows10系统教程

本篇教程主要教大家怎么在ESXi虚拟机上安装Windows10系统&#xff0c;首先安装Windows10需要准备一个ISO系统镜像文件&#xff0c;我们可以去MSDN或者是微软官网下载。 镜像下载教程&#xff1a; 下两种方法都可以下载ISO镜像文件&#xff0c;任选其一下载即可 方法一&#xf…

BDD110 HNLP205879R1设备控制、监视、报警及打印报表等管理功能

​ BDD110 HNLP205879R1设备控制、监视、报警及打印报表等管理功能 基于ABB AC500系列PLC的水泥生产线控制系统 随着中国经济的迅速发展&#xff0c;各行各业对水泥的需求日益增加。目前国内外各大水泥企业纷纷在华兴建大型干法旋窑水泥生产线&#xff0c;这为水泥行业的发展提…

【SWAT水文模型】ArcSWAT安装

SWAT水文模型-ArcSWAT安装 安装ArcSWAT1.1 下载ArcSWAT1.2 安装ArcSWAT1.3 加载ArcSWAT 参考 SWAT水文模型原理及数据库简介可参见另一博客文章-【水文模型】SWAT水文模型原理及数据库简介。 本博客主要介绍ArcSWAT的安装。 安装ArcSWAT 1.1 下载ArcSWAT 安装之前&#xff0…

广域通信网 - 差错控制(停等 ARQ 协议、选择重发 ARQ 协议、后退 N 帧 ARQ 协议)

文章目录 1 概述2 差错控制的办法2.1 停等 ARQ 协议2.2 选择重发 ARQ 协议2.3 后退 N 帧 ARQ 协议 3 扩展3.1 流量控制3.2 网工软考真题 1 概述 #mermaid-svg-ju8w1gQxodkcBbaB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#me…