virtio-networking 4: 介绍 vDPA 1

一、引言与背景

  1. 文章定位与时间:该文章发布于 2019 年 10 月 2 日,旨在以开放标准方式实现虚拟机(VM)的网络线速性能,并重点介绍 vDPA 技术;目标读者为希望理解不同 virtio - networking 架构(含 vDPA)核心本质,无需深入过多细节的人群,且后续将推出技术深度解析与实操文章。

  2. 传统架构回顾:此前文章已讨论两种现有 virtio - networking 架构,分别是内核级的 vhost - net/virtio - net 和用户空间 / DPDK 级的 vhost - user/virtio - pmd,本文将聚焦能为 VM 提供线速性能的新兴 virtio - networking 架构。

  3. 核心概念铺垫:为实现 NIC 与 VM 的直接通信,需区分数据平面与控制平面:

    • 数据平面:用于传输实际数据包,若 NIC 直接连接 VM,需 NIC 与 VM 支持完全相同的环形布局,否则会产生性能损耗的转换操作,实际通过 NIC 与 VM 可访问的共享内存实现,且绕过主机内核。
    • 控制平面:用于 NIC 与 VM 间的配置变更和能力协商(含数据平面的建立与终止),其传输路径(主机内核或 Qemu 进程)依具体实现而定。

二、SR - IOV 技术:VM 流量隔离方案

  1. 技术定位:在传统 virtio 架构中,需软件交换机(如 OVS)分配单 NIC 资源给多 VM,而 SR - IOV(单根 I/O 虚拟化)是一种 PCI 设备分配标准,可将单个物理 NIC 共享给多个 VM,解决 "在物理 NIC 上创建虚拟端口" 的问题。
  1. 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 就能实现限速,但问题是厂商绑定。

  1. 核心组件

    • 物理功能(PF) :完整的 PCI 设备,具备常规 PCI 设备的发现、管理和配置功能,每个 NIC 仅 1 个 PF,负责整个 NIC 设备的实际配置(如 10GB NIC 外部端口的速度和双工模式)。
    • 虚拟功能(VF) :从 PF 衍生的简化 PCI 功能,仅控制设备的部分资源,每个 NIC 可存在多个 VF(如 1 个 10GB NIC 可支持 8 个 VF),支持配置速率限制等功能。
  2. 映射方式: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 应用,是常见的第四种方式。
  3. 技术缺点:存在强厂商依赖性,NIC 与 VM 间的环形布局为特定厂商私有,需匹配厂商提供的驱动;NIC 固件升级可能需同步升级 VM 应用驱动,更换不同厂商 NIC 需 VM 使用新 PMD;VM 仅能迁移到配置完全相同(相同 NIC 及版本、相同物理位置等)的主机。

三、基于 virtio 的线速解决方案

为了摆脱厂商绑定,我们需要使用一种标准接口。 从而实现在虚拟机内部使用原生驱动和厂商驱动进行解耦。

(一)virtio 全硬件卸载

  1. 技术原理将 virtio 数据平面和控制平面均卸载到硬件 ,物理 NIC(仍通过 VF 暴露多个虚拟接口)需完整支持 virtio 控制规范(含设备发现、功能协商、数据平面建立 / 终止等)和 virtio 环形布局; 一旦内存映射建立,VM 可直接通过 PCI 与 NIC 通信,无需主机内核额外驱动。
  2. 关键说明:实际控制平面需与内存管理单元(IOMMU、vIOMMU)交互(后续深度文章详解);架构图为简化流程,省略了主机内核、Qemu 进程和 VM 内核中的部分组件;除用户空间的 virtio - pmd 驱动,也可使用 VM 内核中的 virtio - net 驱动直接与 NIC 通信。
  3. 技术缺点需 NIC 厂商在硬件中完整实现 virtio 规范 (含通常由主机 OS 软件实现的控制平面),不同厂商的实现存在差异,仍有一定厂商绑定属性。

请注意以下几点:

  • 实际上,控制平面更为复杂,需要与内存管理单元(IOMMU,输入输出内存管理单元;vIOMMU,虚拟输入输出内存管理单元)进行交互,相关细节将在后续的技术深度解析文章中介绍。

  • 为简化流程,主机内核、QEMU 进程以及客户机内核中还存在一些额外模块未在(图示 / 流程中)体现。

  • 此外,还存在一种方案:将 virtio(虚拟 I/O)的数据平面与控制平面迁移至内核空间,而非置于用户空间(SR-IOV 场景中也存在类似方案)。这意味着我们会使用客户机内核中的 virtio-net 驱动程序,直接与网卡(NIC)进行通信(而非如前文所示,在客户机用户空间中使用 virtio-PMD 驱动程序)。

(二) vDPA - standard data plane(虚拟数据路径加速)

标准化 NIC SRIOV data plane

  1. 技术核心:作为 SR - IOV 之上的抽象层,标准化 NIC SR - IOV 数据平面(采用 virtio 环形布局),VM 使用单一通用 virtio 驱动(与厂商无关);主机内核添加通用 vDPA 驱动,负责将厂商特定 NIC 驱动 / 控制平面转换为 virtio 控制平面,同时支持可扩展 IOV 等新兴技术。

  2. 架构特点:数据平面与 virtio 全硬件卸载类似,从 NIC 直接到 VM;架构图省略部分组件以简化流程;数据平面和控制平面也可接入 VM 内核(而非用户空间),优缺点与 SR - IOV、virtio 全硬件卸载场景一致。

  3. 核心优势

    • 开放标准:基于 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. 成熟度 完全成熟 完全成熟 完全成熟 中(部分组件仍在开发)

五、总结与后续预告

  1. 内容总结:文章完整介绍了四种为 VM 提供以太网接口的 virtio - networking 架构,性能覆盖从低速(vhost - net)、中速(vhost - user)到线速(virtio 全硬件卸载、vDPA);重点突出 vDPA 相比其他 virtio 解决方案及 SR - IOV 的优势,如标准化、低厂商依赖、支持迁移等。
  2. 后续计划:下一篇文章将详解 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 内核客户端)和成熟度三个维度对比,各架构表现如何?

答案:三个维度的对比情况如下:

  1. 热迁移支持:vhost - net/virtio - net 和 vhost - user/virtio - pmd 均支持热迁移;virtio 全硬件卸载不支持热迁移;vDPA 支持热迁移(需 NIC 支持)。
  2. 应用可用性(VM 内核客户端) :vhost - net/virtio - net、virtio 全硬件卸载、vDPA 的应用可用性均为高(对用户透明);vhost - user/virtio - pmd 在此维度不适用(NA)。
  3. 成熟度:vhost - net/virtio - net、vhost - user/virtio - pmd、virtio 全硬件卸载均完全成熟;vDPA 成熟度为中(部分组件仍在开发)。

参考:

  1. www.redhat.com/en/blog/ach...
相关推荐
橙子家4 小时前
接口 IResultFilter、IAsyncResultFilter 的简介和用法示例(.net)
后端
bobz9654 小时前
Virtio-networking: 2019 总结 2020展望
后端
AntBlack4 小时前
每周学点 AI : 在 Modal 上面搭建一下大模型应用
后端
G探险者5 小时前
常见线程池的创建方式及应用场景
后端
柏油6 小时前
MySQL InnoDB 架构
数据库·后端·mysql
一个热爱生活的普通人6 小时前
Golang time 库深度解析:从入门到精通
后端·go
一只叫煤球的猫6 小时前
怎么这么多StringUtils——Apache、Spring、Hutool全面对比
java·后端·性能优化
MrHuang9657 小时前
保姆级教程 | 在Ubuntu上部署Claude Code Plan Mode全过程
后端
紫穹7 小时前
008.LangChain 输出解析器
后端