virtio net 用户态实现: virtio-user
1. 一段话总结
该博客围绕vhost-user/virtio-pmd 架构 展开,先回顾了已广泛部署但存在性能开销的vhost-net/virtio-net 架构 ,随后介绍了为解决性能问题所依赖的DPDK(Data Plane Development Kit) (通过轮询模式驱动 PMD 绕开内核网络栈提升 packet 处理速度)与OVS-DPDK (将 OVS 内核转发表移至用户空间,结合 PMD 进一步优化),详细阐述了 vhost-user(主机用户空间,作为 OVS-DPDK 一部分)与 virtio-pmd(客户机用户空间,轮询模式驱动)组成的新架构,其能使整体性能提升2 至 4 倍 ,但需应用链接 DPDK 库、依赖专业配置,在虚拟网络功能(VNFs) 等对性能要求极高的场景适用,后续还将推出该架构内部细节的深度解析内容。

一、概述与前期架构
-
定位:从宏观层面介绍基于 DPDK 的 virtio 架构,后续将推出面向架构师 / 开发者的技术深度解析博客及实操博客。
-
前期架构回顾:vhost-net/virtio-net 架构
- 组成:主机端内核中的 vhost-net(后端)、客户机端内核中的 virtio-net(前端)。
- 现状:已广泛部署,具备一定实用性,客户机中开发的应用可通过标准 Linux 套接字(借助主机)连接网络,对用户友好。
- 缺陷:存在性能开销,并非最优解决方案,需后续架构优化。
二、性能优化核心技术解析
(1)DPDK(Data Plane Development Kit)
-
目标:为数据平面应用提供简单且完整的快速 packet 处理框架。
-
核心机制:
- 采用 "运行至完成" 的 packet 处理模式,需在调用数据平面应用前预分配所有资源,且这些专用资源在专用逻辑处理核心上执行。
- 与 Linux 内核对比:Linux 内核依赖调度器和中断实现进程切换,而 DPDK 通过持续轮询访问设备,避免了上下文切换和中断处理的开销,但代价是需将部分 CPU 核心 100% 用于 packet 处理。
-
关键组件:轮询模式驱动(PMD)
- 功能:实现用户空间与物理接口之间的直接 packet 传输,完全绕开内核网络栈。
- 优势:消除中断处理环节、绕开内核栈,相比内核转发显著提升性能。
-
使用方式:DPDK 是一组库,需应用层链接这些库并调用相关 API 才能使用。

(2)OVS-DPDK
-
传统 OVS 局限:传统 Open vSwitch(OVS)通常依赖内核空间数据路径转发,内核模块含简单流表;但 "例外包"(OpenFlow 流中的第一个包)因不匹配内核流表,需发送至用户空间 OVS 守护进程(ovs-vswitchd)处理,且受 Linux 网络栈限制,无法满足高 packet 速率需求。
-
OVS-DPDK 优化:
- 整合 OVS 与 DPDK,借助 PMD 驱动,将传统 OVS 的内核模块转发表移至用户空间。
- 架构特点:所有 OVS 组件运行在用户空间,通过 PMD 驱动与物理 NIC 通信。
-
扩展能力:不仅主机用户空间可运行 DPDK 应用,客户机用户空间也能运行带 PMD 驱动的 DPDK 应用。

三、vhost-user/virtio-pmd 架构详解

(1)架构组成
组件 | 运行空间 | 核心特点 | 功能作用 |
---|---|---|---|
vhost-user(后端) | 主机用户空间 | 属 OVS-DPDK 用户空间应用的一部分,基于 DPDK 库(含额外 API) | 主机上每创建一个客户机 VM,就实例化一个 vhost-user 后端,与客户机的 virtio 前端通信 |
virtio-pmd(前端) | 客户机用户空间 | 轮询模式驱动,占用专用核心,无中断处理 | 客户机用户空间应用需链接 DPDK 库,才能使用 virtio-pmd 优化数据平面 |
(2)与前期架构对比
- 替换关系:vhost-user/virtio-pmd 架构中,vhost-net 被vhost-user 替换,virtio-net 被virtio-pmd替换。
- 性能提升:主机用户空间通过共享内存直接访问物理 NIC(绕开内核),客户机用户空间使用 virtio-pmd(同样绕开内核),整体性能可提升2 至 4 倍。
(3) usability 权衡
- 前期架构优势:vhost-net/virtio-net 架构中,客户机 OS 视角下数据平面通信简单,仅需在客户机内核中添加 virtio 驱动,客户机用户空间应用即可自动获得标准 Linux 网络接口。
- 新架构局限:vhost-user/virtio-pmd 架构中,客户机用户空间应用需使用 DPDK 库中的 virtio-pmd 驱动,配置和优化 DPDK 需专业知识,操作难度较大。
四、架构应用场景与后续计划
- 适用场景:适用于虚拟网络功能(VNFs) 等对性能要求极高的场景,此类场景中性能是关键因素,基于 DPDK 的 virtio 架构可帮助达成预期性能目标。
- 开发要求:开发基于该架构的应用需专业知识,且需深入理解 DPDK API 及其各类优化方式。
- 后续内容:下一篇博客将深入解析 vhost-user/virtio-pmd 架构的内部结构,以及其不同的控制平面和数据平面组件。
4. 关键问题
问题 1:vhost-user/virtio-pmd 架构相比传统的 vhost-net/virtio-net 架构,在性能和 usability 上分别有怎样的差异?
答案:性能方面
-
vhost-user/virtio-pmd 架构通过主机用户空间借助共享内存直接访问物理 NIC(绕开内核)、客户机用户空间使用 virtio-pmd(绕开内核),整体性能相比 vhost-net/virtio-net 架构提升2 至 4 倍;
-
usability 方面,vhost-net/virtio-net 架构中客户机 OS 仅需添加 virtio 驱动,应用即可自动获得标准 Linux 网络接口,操作简单;
-
而 vhost-user/virtio-pmd 架构要求客户机应用链接 DPDK 库并使用 virtio-pmd 驱动,配置和优化需专业知识,难度更高。
问题 2:DPDK(Data Plane Development Kit)通过哪些核心机制实现对 packet 处理性能的提升?这些机制又带来了哪些代价?
答案:核心机制包括:
-
- 采用 "运行至完成" 的 packet 处理模式,调用数据平面应用前预分配所有资源,并在专用逻辑核心上执行;
-
- 通过持续轮询访问设备,而非依赖 Linux 内核的调度器和中断,避免上下文切换和中断处理开销;
-
- 提供轮询模式驱动(PMD),实现用户空间与物理接口直接传包,绕开内核网络栈。带来的代价是需将部分 CPU 核心100% 专用于 packet 处理,无法用于其他任务。
问题 3:OVS-DPDK 相比传统的 Open vSwitch(OVS),在架构上做了哪些关键调整?这些调整如何适配 vhost-user/virtio-pmd 架构的需求?
答案:关键调整:传统 OVS 依赖内核空间数据路径转发,"例外包" 需交用户空间处理,且受 Linux 网络栈限制;
OVS-DPDK 整合 OVS 与 DPDK,将传统 OVS 的内核模块转发表移至用户空间,并借助 DPDK 的 PMD 驱动与物理 NIC 通信,所有 OVS 组件均运行在用户空间。
适配需求:vhost-user/virtio-pmd 架构的核心是在用户空间实现高性能数据传输(绕开内核),OVS-DPDK 将转发逻辑移至用户空间并结合 PMD 的设计,与该架构 "主机用户空间运行 vhost-user、依赖高效硬件交互" 的需求契合,为 vhost-user 提供了高效的转发平面支持,保障了整体架构的性能优势。