
一、引言与背景
-
文章定位与时间:该文章发布于 2019 年 10 月 2 日,旨在以开放标准方式实现虚拟机(VM)的网络线速性能,并重点介绍 vDPA 技术;目标读者为希望理解不同 virtio - networking 架构(含 vDPA)核心本质,无需深入过多细节的人群,且后续将推出技术深度解析与实操文章。
-
传统架构回顾:此前文章已讨论两种现有 virtio - networking 架构,分别是内核级的 vhost - net/virtio - net 和用户空间 / DPDK 级的 vhost - user/virtio - pmd,本文将聚焦能为 VM 提供线速性能的新兴 virtio - networking 架构。
-
核心概念铺垫:为实现 NIC 与 VM 的直接通信,需区分数据平面与控制平面:
- 数据平面:用于传输实际数据包,若 NIC 直接连接 VM,需 NIC 与 VM 支持完全相同的环形布局,否则会产生性能损耗的转换操作,实际通过 NIC 与 VM 可访问的共享内存实现,且绕过主机内核。
- 控制平面:用于 NIC 与 VM 间的配置变更和能力协商(含数据平面的建立与终止),其传输路径(主机内核或 Qemu 进程)依具体实现而定。

二、SR - IOV 技术:VM 流量隔离方案
- 技术定位:在传统 virtio 架构中,需软件交换机(如 OVS)分配单 NIC 资源给多 VM,而 SR - IOV(单根 I/O 虚拟化)是一种 PCI 设备分配标准,可将单个物理 NIC 共享给多个 VM,解决 "在物理 NIC 上创建虚拟端口" 的问题。
- dpdk + sriov:

dpdk + sriov:the ring layout is shared between the physical NIC and the guest.
虚拟机网卡和物理网卡共享同一个 ring layout
2.sriov 直接映射网卡到 虚拟机:
在虚拟机和物理机建立内存映射的前提下,如何高效的 send/receive:
- 虚拟机内核使用厂商网卡驱动: 直接映射内存 IO,这样以来,宿主机硬件设备可以直接访问虚拟机内核的内存
- 虚拟机内核使用 DPDK pmd 驱动:在虚拟机用厂商提供的 DPDK PMD 驱动,直接映射内存 IO,这样一来,宿主机硬件设备可以直接访问虚拟机用户态进程的内存

-
数据平面是厂商特定的,且直接通向虚拟功能(VF)。
-
对于单根 I/O 虚拟化(SR-IOV)技术而言,要实现这一方案,主机内核(物理功能 / PF 驱动程序)和客户机用户空间(虚拟功能 / VF 轮询模式驱动程序 / PMD)中均需配备厂商特定的网卡(NIC)驱动程序。
-
主机内核驱动程序与客户机用户空间 PMD 驱动程序不直接通信。物理功能(PF)/ 虚拟功能(VF)驱动程序需通过其他接口进行配置(例如,主机物理功能驱动程序可由虚拟化管理工具 libvirt 进行配置)。
-
客户机用户空间中的厂商特定虚拟功能轮询模式驱动程序(vendor-VF-PMD)负责配置网卡的虚拟功能(VF),而主机内核空间中的厂商特定物理功能驱动程序(vendor-PF-driver)则负责管理整个网卡(NIC)。
注意从这里可以看到:libvirt 还具备和 PF 驱动建立控制面的功能。
SR-IOV 和 DPDK 就能实现限速,但问题是厂商绑定。
-
核心组件
- 物理功能(PF) :完整的 PCI 设备,具备常规 PCI 设备的发现、管理和配置功能,每个 NIC 仅 1 个 PF,负责整个 NIC 设备的实际配置(如 10GB NIC 外部端口的速度和双工模式)。
- 虚拟功能(VF) :从 PF 衍生的简化 PCI 功能,仅控制设备的部分资源,每个 NIC 可存在多个 VF(如 1 个 10GB NIC 可支持 8 个 VF),支持配置速率限制等功能。
-
映射方式:hypervisor 负责将 VF 映射到 VM,1 个 VF 同一时间仅可映射到 1 个 VM(1 个 VM 可映射多个 VF),具体映射场景包括:
- OVS 内核 + SR - IOV:通过 VF 为 OVS 提供多个 "物理端口"(如不同 MAC 地址),实际仅 1 个物理 NIC,将每个 VF 对应的内核内存段映射到 NIC 的 VF。
- OVS DPDK+SR - IOV:NIC 直接绕过主机内核连接用户空间的 OVS DPDK,将主机用户空间内存映射到 NIC 的 VF。
- SR - IOV 直接映射到 VM:VM 内存直接映射到 NIC,完全绕过主机;VM 可通过两种方式与 NIC 通信,一是使用 VM 内核中的厂商特定 NIC 驱动,二是使用 VM 用户空间中的厂商特定 DPDK PMD 驱动(本文重点讨论此方式)。
- 映射到 VM 内 DPDK 应用:将设备分配给 VM 用户空间内的 DPDK 应用,是常见的第四种方式。
-
技术缺点:存在强厂商依赖性,NIC 与 VM 间的环形布局为特定厂商私有,需匹配厂商提供的驱动;NIC 固件升级可能需同步升级 VM 应用驱动,更换不同厂商 NIC 需 VM 使用新 PMD;VM 仅能迁移到配置完全相同(相同 NIC 及版本、相同物理位置等)的主机。
三、基于 virtio 的线速解决方案
为了摆脱厂商绑定,我们需要使用一种标准接口。 从而实现在虚拟机内部使用原生驱动和厂商驱动进行解耦。
(一)virtio 全硬件卸载
- 技术原理 :将 virtio 数据平面和控制平面均卸载到硬件 ,物理 NIC(仍通过 VF 暴露多个虚拟接口)需完整支持 virtio 控制规范(含设备发现、功能协商、数据平面建立 / 终止等)和 virtio 环形布局; 一旦内存映射建立,VM 可直接通过 PCI 与 NIC 通信,无需主机内核额外驱动。
- 关键说明:实际控制平面需与内存管理单元(IOMMU、vIOMMU)交互(后续深度文章详解);架构图为简化流程,省略了主机内核、Qemu 进程和 VM 内核中的部分组件;除用户空间的 virtio - pmd 驱动,也可使用 VM 内核中的 virtio - net 驱动直接与 NIC 通信。
- 技术缺点 :需 NIC 厂商在硬件中完整实现 virtio 规范 (含通常由主机 OS 软件实现的控制平面),不同厂商的实现存在差异,仍有一定厂商绑定属性。

请注意以下几点:
-
实际上,控制平面更为复杂,需要与内存管理单元(IOMMU,输入输出内存管理单元;vIOMMU,虚拟输入输出内存管理单元)进行交互,相关细节将在后续的技术深度解析文章中介绍。
-
为简化流程,主机内核、QEMU 进程以及客户机内核中还存在一些额外模块未在(图示 / 流程中)体现。
-
此外,还存在一种方案:将 virtio(虚拟 I/O)的数据平面与控制平面迁移至内核空间,而非置于用户空间(SR-IOV 场景中也存在类似方案)。这意味着我们会使用客户机内核中的 virtio-net 驱动程序,直接与网卡(NIC)进行通信(而非如前文所示,在客户机用户空间中使用 virtio-PMD 驱动程序)。
(二) vDPA - standard data plane(虚拟数据路径加速)
标准化 NIC SRIOV data plane
-
技术核心:作为 SR - IOV 之上的抽象层,标准化 NIC SR - IOV 数据平面(采用 virtio 环形布局),VM 使用单一通用 virtio 驱动(与厂商无关);主机内核添加通用 vDPA 驱动,负责将厂商特定 NIC 驱动 / 控制平面转换为 virtio 控制平面,同时支持可扩展 IOV 等新兴技术。
-
架构特点:数据平面与 virtio 全硬件卸载类似,从 NIC 直接到 VM;架构图省略部分组件以简化流程;数据平面和控制平面也可接入 VM 内核(而非用户空间),优缺点与 SR - IOV、virtio 全硬件卸载场景一致。
-
核心优势
- 开放标准:基于 Virtio 规范,任何人可查看、使用并参与规范优化,无厂商锁定。
- 线速性能:与 SR - IOV 相当,数据传输无中间介质或转换器。
- 未来兼容:可支持可扩展 IOV 等平台级新兴技术。
- 简化认证:VM 使用通用驱动,无需因 NIC 厂商 / 版本变更重新认证(适用于 Guest OS 和容器 / 用户空间镜像)。
- 透明保护:VM 使用单一接口,主机侧通过两个接口(后端保护)提供保护,如 vDPA NIC 断开时,主机内核可快速识别并自动切换 VM 到备用 virtio 接口(如 vhost - net 后端)。
- 支持热迁移:因 VM 端环形布局标准化,可跨不同厂商、不同版本的 NIC 实现 VM 热迁移(需 NIC 支持)。
- 扩展场景:可提供容器标准加速接口(后续文章讨论);远期可实现裸机场景,通过内核 vDPA 软件基础设施,让单一通用 virtio - net 驱动支持不同硬件 NIC(类似存储领域的 NVMe 驱动)。

四、四种 virtio 架构对比

通过多维度对比 vhost - net/virtio - net、vhost - user/virtio - pmd、virtio 全硬件卸载、vDPA 四种架构,具体如下表所示:
对比维度 | vhost - net/virtio - net | vhost - user/virtio - pmd | Virtio 全硬件卸载 | vDPA |
---|---|---|---|---|
1. 性能 | 低 | 中 | 高(线速) | 高(线速) |
2. 保护 | 前端 / 后端 | 前端 / 后端 | 前端 | 前端 / 后端 |
3. NIC 数据平面支持 | 否 | 否 | 是 | 是 |
4. NIC 控制平面支持 | 否 | 否 | 是 | 否 |
5. 应用可用性(VM 用户空间客户端) | 不适用(NA) | 中(需 DPDK 库) | 中(需 DPDK 库) | 目前不适用;未来基于 AF_VIRTIO 概念可达高 |
6. 应用可用性(VM 内核客户端) | 高(对用户透明) | 不适用(NA) | 高(对用户透明) | 高(对用户透明) |
7. 热迁移 | 是 | 是 | 否 | 是(需 NIC 支持) |
8. 成熟度 | 完全成熟 | 完全成熟 | 完全成熟 | 中(部分组件仍在开发) |
五、总结与后续预告
- 内容总结:文章完整介绍了四种为 VM 提供以太网接口的 virtio - networking 架构,性能覆盖从低速(vhost - net)、中速(vhost - user)到线速(virtio 全硬件卸载、vDPA);重点突出 vDPA 相比其他 virtio 解决方案及 SR - IOV 的优势,如标准化、低厂商依赖、支持迁移等。
- 后续计划:下一篇文章将详解 virtio 全硬件卸载与 vDPA 的构建模块;之后推出实操文章;未来文章将聚焦 vDPA 在容器、混合云(本地、AWS、阿里云裸机服务器)中的应用。
4. 关键问题
问题 1:SR - IOV 技术在为 VM 分配 NIC 资源时,核心组件 PF 和 VF 的功能区别是什么?且该技术存在哪些显著局限性?
答案:
SR - IOV 的核心组件 PF(物理功能)是完整的 PCI 设备,具备常规 PCI 设备的发现、管理和配置功能,每个 NIC 仅 1 个 PF,负责整个 NIC 的整体配置(如 10GB NIC 外部端口的速度和双工模式);
VF(虚拟功能)是从 PF 衍生的简化 PCI 功能,仅控制 NIC 的部分资源,每个 NIC 可存在多个 VF(如 1 个 10GB NIC 可支持 8 个 VF),支持配置速率限制等局部参数。
其显著局限性是强厂商依赖性,NIC 与 VM 间的环形布局为厂商私有,需匹配厂商驱动;(不通用,厂商绑定)
NIC 固件升级可能需同步升级 VM 驱动,更换厂商 NIC 需 VM 换用新 PMD;VM 仅能迁移到配置完全相同(相同 NIC 及版本、物理位置等)的主机。
问题 2:vDPA 技术如何在实现 VM 网络线速性能的同时,解决 SR - IOV 和 virtio 全硬件卸载的厂商依赖问题?
答案:
vDPA 实现线速性能的关键在于数据平面采用 virtio 环形布局,使 NIC 可直接与 VM 通信,无需中间介质或转换器,性能与 SR - IOV 相当。
在解决厂商依赖方面,vDPA 作为 SR - IOV 之上的抽象层,标准化了数据平面(virtio 环形布局),让 VM 使用单一通用 virtio 驱动(与厂商无关);
同时在主机内核添加通用 vDPA 驱动,将厂商特定 NIC 驱动 / 控制平面转换为 virtio 控制平面,避免 VM 依赖特定厂商的硬件实现;
- 而 virtio 全硬件卸载需厂商在 NIC 内完整实现 virtio 规范(含控制平面)
- SR - IOV 需 VM 使用厂商特定驱动
- vDPA 则通过标准化和通用驱动 / 转换层彻底解决了厂商依赖。
问题 3:在四种 virtio 架构(vhost - net/virtio - net、vhost - user/virtio - pmd、virtio 全硬件卸载、vDPA)中,从热迁移支持、应用可用性(VM 内核客户端)和成熟度三个维度对比,各架构表现如何?
答案:三个维度的对比情况如下:
- 热迁移支持:vhost - net/virtio - net 和 vhost - user/virtio - pmd 均支持热迁移;virtio 全硬件卸载不支持热迁移;vDPA 支持热迁移(需 NIC 支持)。
- 应用可用性(VM 内核客户端) :vhost - net/virtio - net、virtio 全硬件卸载、vDPA 的应用可用性均为高(对用户透明);vhost - user/virtio - pmd 在此维度不适用(NA)。
- 成熟度:vhost - net/virtio - net、vhost - user/virtio - pmd、virtio 全硬件卸载均完全成熟;vDPA 成熟度为中(部分组件仍在开发)。