DPDK系列之十七DPDK网络虚拟化virtio-user

文章介绍了virtio作为半虚拟化标准在DPDK中的应用,尤其是virtio-user,它将设备驱动移到用户态,提高了效率。virtio-pmd是DPDK中的用户态驱动,支持vdev虚拟设备,可在无KVM/QUEM环境中使用。UIO和VFIO是用户态驱动的两种技术,VFIO提供了IOMMU支持,比UIO更安全。virtio-user则在用户态实现virtio-net设备,简化了虚拟化环境下的网络通信。文章强调了这些技术在云环境和容器中的重要性。

一、介绍

virtio做为半虚拟化的应用标准,在DPDK中最典型的应用其实就是virtio-user,在前面的vhost-user一样,都是把工作放到了用户态。也就是说,virtio-user把设备驱动搬到了用户态,在virtio-net(网络半虚拟化)中,这样做能够更好的提高应用效率。而在DPDK中把这种驱动称之为virtio-pmd,而DKDK中的virtio-user既可以创建virtio设备并与后端的vhost完成初始化配置,又可以在没有KVM/QUEM的参与的非虚拟环境下使用相关的virtio设备。
再次强调一次,DPDK中virtio-pmd支持vdev虚拟设备。这在现在云技术应用中非常用用处。这种设备是DPDK自己在用户态虚拟的内部设备,由DPDK自己管理,这点要清楚,它是和由KVM/QUEM模拟出的virtio-pci设备是两回事。
这里对virtio-pmd做一个说明:
virtio-pmd,即virtio设备的PMD,Poll Mode Driver,学过网络编程的应用知道啥Poll,它通过VFIO接口实现对虚拟或者物理网卡(NIC)的用户态配置和数据处理。

二、用户态驱动

在大家的眼中,一般习惯的把驱动理解成内核态,毕竟从一开始学习牵扯硬件和OS的相关知识,都强调驱动的重要性。毕竟OS就是为了隔离用户直接和硬件打交道的,硬件的复杂性和安全性都不能随便开放给普通用户。但是,随着应用技术的不断发展,出现了一些新的需求。大规模的数据通信和处理被内核的性能和管理限制的条条框框太多。技术人员需要不断的压榨整条数据链上的所有的剩余价值,那么在某些情况就提出了把驱动做到用户态,减少数据链中的传送节点,少的中间节点越多,理论上传输速度一定会更快。
用户态驱动最主要的就是把原来内核态需要处理的中断和硬件地址等内核态才能访问的内容能映射到用户态来。用户态的驱动技术有两种即,UIO和VFIO。DPDK中,20.02版本前同时支持两类,但以UIO为主,更早期则只支持UIO;但在此版本后,基于UIO框架的igb_uio模块不再进入默认编译选项。即DPDK不再建议使用UIO。
在网上很多人都推荐使用版本20以前的做为入门学习的原因大概也是因此。

三、DPDK中实现机制

DPDK中也是上面的两种实现机制,即UIO和VFIO:
1、UIO
UIO是“Userspace I/O”的缩写,它的基本原理就是为每个注册使用的UIO设备提供一个/DEV/UIOx的字符设备,通过这个字符设备可以实现设备映射(mmap)和设备中断开关以及中断获取得操作。UIO是一个应用框架,使用它需要自己实现一个内核驱动模块。而在DPDK中,则igb_uio。
igb_uio是一个标准的PCI设备驱动,提供Probe接口来向内核接管相关设备。通过UIO的接口注册,提供UIO的用户态文件接口。也就是通过此框架,实现了从内核到用户态的一个操作转化。但由于其没有IOMMU(Input/Output Memory Management Unit),如果想使用相关的物理地址必须要进行映射并注册给NIC。这种方式的应用有两个缺陷:
a、不支持IOMMU,使用设备DMA比较复杂并县城需要Root权限。地址映射异常会引起崩溃。
b、一个设备只支持一个中断,对Polling模式的DPDK影响有限,但扩展受限。

2、VFIO
VFIO,即“Virtual Function I/O”,可以简单理解为对UIO的高级版本。其主要通过IOMMU来进行DMA设备的访问和中断重定向。知道OS中的MMU大概就会明白IOMMU,其实就是一层抽象隔离,隔离就是为了更好的兼容性和扩展性。不过它也和UIO一样需要映射到指定的/dev/vfio/xx中来进行实现相关驱动。VFIO也是有接口层和具体的设备驱动模块,即vfio,vfio-pci。NIC绑定到vfio-pci驱动,再由VFIO提供的相关文件(即刚刚提到的/dev/vfio/xx)接口来操作。
VFIO不需要Root权限,通过注册eventfd来提供中断irq的用户态揽收方式。

四、virtio-user的功能

在DPDK中,virtio-user实现的主要功能有:
1、在用户态实现了virtio-net设备,与传统的虚拟化技术不同,virtio-user在用户态进程实现了virtio-pmd和其后端控制面配置。
2、实现了virtio-user在内部总线上与vhost-net或者vhost-user的通信。
这基本上是可以根据实际情况把KVM/QUEM省略来实现高速的网络通信。

五、总结

前面的分析忽略了对virtio-user的介绍,这章补回来。
virtio-pmd主要的应用场景就是在虚拟机中,可以更好的提高虚拟机中的网络通信效率;当然,它也支持virtio设备的PF和VF的物理网卡操作。而virtio-user除了上述与内核交互的应用外则在容器中应用,通过virtio-user与vhost-net或者vhost-user通信来更好的实现高性能的网络通信。
介绍理论总是比较枯燥,但这又是必不可少的一部分,这其实就像买回来一台设备,先看说明书一样。少走弯路,最快掌握。

<think>嗯,用户想深入了解virtio、vhost和vhost-user的技术细节。从对话历史看,用户已经查阅了一些站内引用资料,但需要系统性的技术解析。用户可能是云计算或虚拟化领域的开发者,正在做性能优化相关的技术选型。 用户提供的三个引用材料很有价值:[1]明确指出vhost在内核空间实现而vhost-user在用户空间;[2]提到qemu2.1开始支持vhost-user;[3]则强调三者都基于virtqueue通信机制。这些正好构成解析框架:先说明virtio的基础架构,再对比两种后端实现的差异。 需要特别注意技术准确性:virtio规范最新版本是1.2但实际广泛使用的是1.1;vhost-net模块从Linux 2.6.34开始集成;DPDK支持vhost-user的起始版本是16.07。这些细节都要核对。 考虑到用户可能关注实践应用,在回复中要突出性能对比表的量化指标(比如上下文切换次数),并给出典型部署场景。最后的问题设计需要层层递进:从基础概念辨析到性能调优,再到具体应用案例。 </think>以下基于引用资料对**virtio、vhost、vhost-user**进行系统性解析,重点突出其架构差异与技术特性: --- ### **1. Virtio虚拟化I/O的核心规范** - **定位**:**前端驱动(Guest OS)与后端驱动(Host)的通用通信协议**,提供标准化的虚拟设备接口[^1]。 - **核心组件**: - **Virtqueues**:数据传输的核心队列(含Descriptor Table/Available Ring/Used Ring)[^3]。 - **特性协商机制**:主机与虚拟机协商支持的功能特性(如多队列、合并缓冲区)。 - **设备配置空间**:存储设备参数(如网卡MAC地址、磁盘容量)。 - **QEMU实现**: - `virtio-blk`(块存储)、`virtio-net`(网络)、`virtio-scsi`(SCSI设备)、`virtio-balloon`(内存气球)[^1]。 - **数据路径**:Guest内核驱动 → QEMU用户空间 → 物理设备(传统模式性能较低)。 --- ### **2. Vhost:内核级加速方案** - **定位**:**将virtio后端驱动移入Linux内核**,缩短I/O路径[^1][^2]。 - **实现方式**: - 通过`vhost-net`等内核模块直接与KVM交互,接管virtio后端处理[^1]。 - Guest的virtio前端驱动直接与`vhost-net`通信,绕过QEMU进程。 - **性能优势**: - **零拷贝**:通过共享内存传递数据包。 - **减少上下文切换**:避免QEMU用户态到内核态的切换开销[^1]。 - 适用于标准网络/存储虚拟化场景(如KVM+Linux Bridge)。 --- ### **3. Vhost-user:用户态灵活扩展** - **定位**:**将virtio后端移至用户态进程**,通过共享内存+IPC通信[^1][^2]。 - **实现方式**: - **基于Unix Domain Socket**:QEMU与后端进程(如OVS-DPDK、SPDK)通过Socket交换队列信息。 - **用户态控制**:后端完全运行在用户空间(如DPDK轮询模式驱动)[^1]。 - **核心优势**: - **定制化数据处理**:允许用户态程序实现专用优化(如DPDK的包处理加速)。 - **跨进程支持**:多个虚拟机可共享同一用户态后端进程[^2]。 - **热迁移友好**:状态管理更灵活。 - **典型应用**: - 基于DPDK的高性能NFV(网络功能虚拟化- SPDK加速的存储虚拟化 --- ### **三者对比** | **特性** | **Virtio (传统)** | **Vhost** | **Vhost-user** | |------------------|------------------------|-------------------------|-------------------------| | **后端位置** | QEMU用户空间 | Linux内核 | 用户态进程(如DPDK) | | **通信方式** | QEMU模拟设备 | 内核共享内存 | Unix Domain Socket | | **性能** | 较低(多次上下文切换) | 高(内核零拷贝) | 极高(用户态零拷贝+轮询)| | **灵活性** | 标准设备支持 | 内核依赖 | 可定制后端逻辑 | | **适用场景** | 通用虚拟化 | 标准网络/存储加速 | NFV/SDN/高性能存储 | > ⚠️ **关键区别**: > - **vhost优化路径**:将virtio后端从QEMU移至**内核**,减少切换开销[^1][^2]。 > - **vhost-user更进一步**:将后端移至**用户态进程**,通过IPC通信实现更高灵活性与性能[^1][^3]。 --- ### **技术演进示例** ```bash # 传统virtio路径 Guest OS → virtio前端 → QEMU进程 → 内核驱动 → 物理网卡 # vhost加速路径 Guest OS → virtio前端 → vhost-net内核模块 → 物理网卡 # vhost-user路径 Guest OS → virtio前端 → QEMU ↔ Unix Socket ↔ 用户态DPDK进程 → 物理网卡 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值