IO半虚拟化-vhost学习笔记

打印 上一主题 下一主题

主题 760|帖子 760|积分 2280

参考:系《深入浅出dpdk》学习笔记以及redhat的官方博客
vhost属于virtio-net网络装备的后端驱动,履历了从virtio-net后端,到内核态vhost-net,到vhost-user的演进过程。先过一下背景知识,
背景知识

QEMU

QEMU 是一个托管虚拟机模仿器,它为客户机提供了一组差别的硬件和装备模型。对于主机,qemu 表现为由标准 Linux 调度程序调度的常规历程,具有自己的历程内存。在此过程中,QEMU为客户机分配内存(被客户机视为物理内存),并实行虚拟机的CPU指令。
要在存储或网络等裸机硬件上实行 I/O,CPU 必须与物理装备交互,实行特殊指令并访问特定内存区域(例如装备映射到的内存区域)。
当客户机(虚拟机)访问这些内存区域时,控制权将返回给 QEMU,QEMU 以对客户机透明的方式实行装备的模仿。
ps:什么叫做对客户机透明呢?好比:当客户机访问由虚拟装备提供的共享内存区域时,这些访问哀求实际上被QEMU截获,并由 QEMU处置惩罚。然而,客户机以为它直接在与物理装备交互,并不必要知道底层的实际处置惩罚过程。
KVM

KVM(Kernel-based Virtual Machine)是Linux内置的一项开源虚拟化技术,为虚拟化软件提供硬件辅助,利用内置的CPU虚拟化技术淘汰虚拟化开销(缓存、I/O、内存),提高安全性。
借助 KVM,QEMU 只需创建一个具有处置惩罚器可辨认的虚拟 CPU (vCPU) 的虚拟机,即可运行本机速度的指令。当 KVM 遇到特殊指令(例如与装备交互的指令或特殊内存区域)时,vCPU 会停息并关照 QEMU 停息的原因,从而答应虚拟机管理程序对该事件做出反应。
QEMU是如何与KVM通信的呢,QEMU打开 /dev/kvm 装备文件,这是与 KVM 内核模块通信的接口。并利用 ioctl(输入输出控制)系统调用与 KVM 装备通信,好比调用ioctl创建一个新的虚拟机实例,添加vCPU、添加内存(由qemu 分配,但从虚拟机的角度来看是物理内存),QEMU可以通过ioctl 调用向vCPU 发送停止,就像外部装备发送停止一样。
其中一个 ioctl 调用会启动实际的 KVM vCPU。这会壅闭 QEMU 历程,使 vCPU 运行,直到遇到必要硬件帮忙的指令为止。但是当 vCPU 遇到必要硬件帮忙的指令时,ioctl 调用返回(这被称为 vmexit,虚拟机退出),由QEMU接受,好比IO操作。
QEMU与virtio-net

virtio-net后端驱动程序的最根本要素是虚拟队列机制、消息关照机制和停止机制。


  • 虚拟队列机制:连接着客户机和宿主机的数据交互
  • 消息关照机制:主要用于从客户机到宿主机的消息关照
  • 停止机制:主要用于从宿主机到客户机的停止哀求和处置惩罚

图片泉源:https://www.redhat.com/en/blog/deep-dive-virtio-networking-and-vhost-net
这个图片形貌的太清晰了,先看一下什么是数据通路和控制通路:


  • 数据通路:virtio 驱动程序必须能够分配内存区域,以便管理程序和装备都可以访问这些内存区域进行读写,即通过内存共享。我们将利用这些内存区域的数据通信部分称为数据平面
  • 控制通路:设置这些内存区域的过程称为控制平面。
接下来再看下数据交互的过程:
virtio 网络装备是一个虚拟以太网卡,它支持TX/RX多队列。空缓冲区被放置在N 个virtqueue 中以吸收数据包,而传出的数据包则被排队到别的N个virtqueue 中进行传输。另一个virtqueue 用于数据平面之外的驱动程序-装备通信,例如控制高级过滤功能、mac 地点等设置或运动队列的数目。作为物理 NIC,virtio 装备支持许多卸载等功能,并可以让真实主机的装备实行这些功能。
要发送数据包,驱动程序会向装备发送一个缓冲区,其中包罗元数据信息(例如数据包所需的卸载),然后是要传输的数据包帧。驱动程序还可以将缓冲区拆分为多个收集条目,例如,它可以将元数据标头与数据包帧拆分开来。
这些缓冲区由驱动程序管理并由装备映射。在这种情况下,装备位于虚拟机管理程序“内部”。由于虚拟机管理程序 (qemu) 可以访问所有客户机的内存,因此它能够定位缓冲区并读取或写入它们。
以下游程图表现了 virtio-net 装备配置以及利用 virtio-net 驱动程序发送数据包的过程,该驱动程序通过 PCI 与 virtio-net 装备进行通信。在填满要发送的数据包后,它利用消息关照机制,触发“可用缓冲区关照”,将控制权返回给 QEMU,以便它可以通过 TAP(内核中的虚拟以太网装备)装备发送数据包。
然后,Qemu 关照客户机缓冲区操作(读取或写入)已完成,它通过将数据放入 virtqueue 并发送已利用关照事件来实现这一点,从而触发客户机 vCPU 中的停止。
吸收数据包的过程与发送数据包的过程雷同。唯一的区别是,在这种情况下,空缓冲区由客户机预先分配并提供给装备,以便装备可以将传入数据写入其中。

但是在这个模型中,由于宿主机、客户机和qemu之间的上下文频繁切换带来的多次数据拷贝和CPU切换,导致性能不尽如人意。可以看出,性能瓶颈处要体如今:


  • 数据通路,从TAP装备到qemu的报文拷贝和qemu到客户机的报文拷贝,两次报文拷贝导致报文继承和发送上都有性能瓶颈
  • 消息关照路径,报文到达tap装备时内核发出并送到qemu的关照信息,然后qemu利用ioctl向kvm哀求停止,kvm发送停止到客户机,复杂的路径带来了不必要的性能开销。
vhost协议

Linux内核态vhost-net

为了对上述报文收发性能瓶颈进行优化,LInux内核设计了vhost-net模块,目的是通过卸载virtio-net在报文收发处置惩罚上的工作,使qemu从virtio-net的虚拟队列工作中解放处置惩罚,淘汰上下文切换数据包拷贝,进而提高报文收发的性能。除此之外,宿主机上的vhost-net模块还必要承担报文到达和发送消息关照及停止的工作。

如图所示,主要差异有两方面:


  • 数据通路:从tap装备继承数据报文,通过vhost-net模块把该报文拷贝到虚拟队列中的数据区,从而使客户机吸收报文。
  • 消息通路:当报文从tap装备到达vhost-net时,通过KVM模块向客户机发送停止,关照客户机吸收报文。如下图(发送通路):

图片泉源:https://www.redhat.com/en/blog/deep-dive-virtio-networking-and-vhost-net
ps:eventfd是一种轻量级的 IPC(历程间通信方式) 实行方式。固然 Unix 套接字答应发送和吸收任何范例的数据,但 eventfd 只是一个整数,生产者可以更改,消耗者可以轮询和读取。这使得它们更适合用作等候/关照机制,而不是信息转达。
vhost-net与OVS(联网)

客户机可以利用 Tap 装备与主机通信,但题目仍旧是如何与同一主机上的其他虚拟机或主机外部的机器通信(例如:通过互联网)
我们可以利用内核网络堆栈提供的任何转发或路由机制(如标准 Linux 桥接器)来实现这一点。但是,更高级的解决方案是利用完全虚拟化、分布式、可管理的交换机,例如开放虚拟交换机(OVS)。
OVS datapath 在此场景中作为内核模块运行,ovs-vswitchd 作为用户空间控制和管理守护历程,ovsdb-server 作为转发数据库。
如下图所示,OVS datapath 在内核中运行,负责在物理网卡和虚拟TAP装备之间转发数据包:

用户态vhost

起首我们相识一下:DPDK 提供了一系列轮询模式驱动程序 (PMD),可实现用户空间和物理接口之间的数据包直接传输,从而完全绕过内核网络堆栈。通过消除停止处置惩罚和绕过内核堆栈,这种方法比内核转发明显提高了性能。

图片泉源:https://www.redhat.com/en/blog/how-vhost-user-came-being-virtio-networking-and-dpdk
Linux内核态的vhost-net模块必要在内核态完成报文拷贝和消息处置惩罚,这会给报文处置惩罚带来肯定的性能丧失,于是就有了用户态的vhost,用户态vhost接纳了共享内存技术,通过共享的虚拟队列来完成报文传输和控制,大大降低了vhost和virtio-net之间的数据传输成本。由于报文拷贝是在用户态进行,因此Linux内核的负担得到减轻。
而virtio/vhost又是如何和dpdk交互的呢?
vhot-user/virtio-pmd 架构

virtio 在主机用户空间和客户机用户空间都利用 DPDK,如图所示:



  • vhost-user(后端) - 作为 OVS-DPDK 用户空间应用程序的一部分在主机用户空间上运行。如前所述,DPDK 是一个库,而 vhost-user 模块是该库内的附加 API。OVS-DPDK 是与此库链接并调用 API 的实际应用程序。对于在主机上创建的每个客户机 VM,将实例化另一个 vhost-user 后端以与客户的 virtio 前端进行通信。
  • virtio-pmd(前端) - 在客户用户空间上运行,是一个轮询模式驱动程序,利用专用焦点并实行无停止轮询。对于在用户空间上运行的应用程序,要利用 virtio-pmd,它还必要与 DPDK 库链接。
如果我们将这种架构与基于内核的 vhost-net/virtio-net 架构进行比较,vhost-net 被 vhost-user 取代,而 virtio-net 被 virtio-pmd 取代。
通过使主机用户空间能够通过共享内存绕过内核直接访问物理 NIC,而且通过在客户机用户空间上利用 virtio-pmd 也绕过内核,整体性能可以提高 2 到 4 倍。
然而,这在可用性方面是有代价的。在 vhost-net/virtio-net 架构中,从客户操作系统的角度来看,数据平面通信非常简单:只需将 virtio 驱动程序添加到客户内核,客户用户空间应用程序就会自动获得一个标准的 Linux 网络接口来工作。
相比之下,在 vhost-user/virtio-pmd 架构中,客户用户空间应用程序必要利用 virtio-pmd 驱动程序(来自 DPDK 库)来优化数据平面。实现比较复杂。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表