virtio-networking 2:vhost-net

150 阅读9分钟

1. 一段话总结 virtio-networking vhost-net

该网页于 2019 年 9 月 9 日发布,围绕virtio-networkingvhost-net展开介绍,首先阐述 virtio 是虚拟机访问简化设备的标准化开放接口,virtio-net是其支持的复杂虚拟以太网卡;

接着介绍了KVM(使 Linux 成为 hypervisor)、QEMU(提供硬件模型)、Libvirt(转换配置并管理进程)等基础构建块;然后讲解了virtio 规范(定义控制面与数据面)和vhost 协议(卸载数据面以提升性能),以及vhost-net/virtio-net 架构(vhost-net 为宿主内核后端,virtio-net 为客户机内核前端,通过共享内存和队列实现数据传输);还提及Open vSwitch(OVS)  用于连接不同虚拟机及外部网络,最后指出后续将有深入探讨该架构及其他 virtio-networking 实现的文章。

image.png

image.png

image.png

image.png

image.png

二、virtio 基础构建块​

  1. 核心概念区分​

概念​定义​
客户机(Guest VM/Guest)​安装、执行并托管在物理机上的 VM,拥有独立操作系统,通过 hypervisor 运行在宿主操作系统之上​
宿主(Host)​托管客户机 VM 的物理机,为客户机提供资源(如虚拟 NIC)​

  1. 三大构建块详情​

构建块​定位​核心功能​关键特点​
KVM​基于内核的虚拟机​1. 使 Linux 具备 hypervisor 能力,hypervisor 组件(内存管理器、调度器、网络栈等)集成于 Linux 内核;2. 虚拟机以普通 Linux 进程形式存在,由标准 Linux 调度器调度,拥有专用虚拟硬件(如网络适配器)​依托 Linux 内核实现 hypervisor 功能,无需额外独立 hypervisor 软件​
QEMU​托管虚拟机监视器​1. 通过仿真为客户机提供多种硬件和设备模型;2. 可与 KVM 结合,借助硬件扩展使 VM 运行速度接近原生;3. 通过命令行界面(CLI)执行客户机,CLI 支持指定所有必要配置选项​需与 KVM 配合以实现高性能,配置和执行依赖 CLI​
Libvirt​接口工具​1. 将 XML 格式配置转换为 QEMU CLI 调用;2. 提供管理守护进程,用于配置 QEMU 等子进程,使 QEMU 无需 root 权限;3. 如 Openstack Nova 创建 VM 时,通过 Libvirt 为每个 VM 启动一个 QEMU 进程​简化 VM 创建流程,降低 QEMU 运行权限要求,是上层应用(如 Openstack Nova)与 QEMU 交互的桥梁​

  1. 构建块运行空间分布​
  • 宿主空间:​
  • 内核空间:运行KVM。​
  • 用户空间:运行Libvirt和QEMU 进程(每个客户机对应一个 QEMU 进程,若创建 N 个 VM,则有 N 个 QEMU 进程,Libvirt 与每个进程通信)。​
  • 客户机空间:运行于 QEMU 进程内部,包含独立的内核空间和用户空间。​

三、virtio 规范与 vhost 协议​

  1. virtio-networking 的两层划分​

层级​用途​核心要求​
控制面(Control plane)​用于宿主与客户机间的能力交换协商,包括数据面的建立与终止​灵活性,以支持未来不同设备和厂商的架构​
数据面(Data plane)​传输宿主与客户机间的实际数据(数据包)​高效性,以实现数据包的快速移动​

  1. virtio 规范与 vhost 协议详情​

名称​维护方 / 特性​核心内容​
virtio 规范​由 OASIS 维护​1. 定义客户机与宿主间控制面和数据面的实现标准;2. 明确数据面的缓冲区和环形布局等细节​
vhost 协议​可在 kernel 或用户空间实现​1. 功能:将 virtio 数据面实现卸载到其他元素(用户进程或内核模块),从而提升性能;2. 局限:仅描述数据面的建立方式,实现者需额外实现描述数据缓冲区(宿主和客户机)的环形布局,以及实际的数据包收发逻辑​

  1. 数据面未在 QEMU 进程实现的原因​

若在 QEMU 进程中基于 virtio 规范实现数据面,每个数据包在 kernel 与客户机间传输时都会发生上下文切换(QEMU 为 Linux 进程),该操作开销大,会增加延迟并消耗更多处理时间,因此需借助 vhost 协议避免此问题,实现数据面从宿主 kernel 直接到客户机的传输,绕过 QEMU 进程。​

四、vhost-net/virtio-net 架构​

  1. 前后端组件定位​

组件​运行空间​角色​别称​
vhost-net​宿主内核空间​virtio 接口的后端(Host side)​vhost-net 驱动​
virtio-net​客户机内核空间​virtio 接口的前端(Guest side)​virtio-net 驱动​

  1. 控制面与数据面机制​
  • 控制面:基于 virtio 规范实现,在 vhost-net 内核模块、QEMU 进程间通信,最终将信息传递到客户机的 virtio-net。​
  • 数据面:​
  • 建立基础:vhost 协议构建框架。​
  • 传输方式:通过共享内存区域,直接在宿主与客户机内核间转发数据包。​
  • 实现载体:借助专用队列完成接收(RX)和传输(TX),队列按虚拟 CPU(vCPU)创建,例如 4 个 vCPU 的场景下,会对应 4 个 RX 队列和 4 个 TX 队列(每个 vCPU 对应 1 组 RX/TX 队列)。​

五、virtio-networking 与 OVS​

  1. OVS 定位与作用​

Open vSwitch(OVS) 是一款软件交换机,能够在 kernel 内部实现数据包转发,用于将客户机通过 virtio-networking 接口传递到宿主 kernel 的数据包,转发给同一宿主上的其他客户机或外部网络(如互联网)。​

  1. OVS 组成结构​

组成部分​运行空间​核心组件与功能​
OVS 用户空间​宿主用户空间​1. ovsdb-server:数据库,用于存储 OVS 相关配置等数据;2. ovs-vswitchd:守护进程,负责管理和控制交换机​
OVS 内核空间​宿主内核空间​ovs 内核模块:负责数据面或转发面的功能,处理数据包的实际转发​

  1. OVS 连接方式​
  • 借助 Linux 端口实现连接:​
  • 一个端口:连接 OVS 内核转发面与物理 NIC。​
  • 另一个端口:连接 OVS 与 vhost-net 后端,进而连接到 virtio-net 和 VM 中运行的应用。​
  • 实际场景:通常存在多个 NIC 通过多个端口连接到 OVS,同时运行多个 VM,因此会有多个端口连接到多个 vhost-net 后端。
  1. 关键问题​

问题 1:在 virtio-networking 中,控制面与数据面的核心区别是什么?各自的核心需求和实现基础分别是什么?​

答案​

  • 核心区别:控制面用于宿主与客户机间能力交换协商(含数据面的建立与终止),传输的是协商类信息;数据面用于传输宿主与客户机间的实际数据包,传输的是业务数据。​
  • 控制面:​
  • 核心需求:灵活性,以支持未来不同设备和厂商的架构。​
  • 实现基础:基于virtio 规范,在 vhost-net/virtio-net 架构中,由 QEMU 进程基于 virtio 规范实现,负责在 vhost-net 内核模块、QEMU 进程与 virtio-net 间传递协商信息。​
  • 数据面:​
  • 核心需求:高效性,以实现数据包的快速移动,避免不必要的性能损耗。​
  • 实现基础:依托vhost 协议构建框架,在 vhost-net/virtio-net 架构中,通过共享内存区域直接在宿主与客户机内核间转发数据包,借助按 vCPU 创建的专用 RX/TX 队列实现数据包收发,且可卸载到 kernel(vhost-net)或用户空间(vhost-user)实现。​

问题 2:vhost-net/virtio-net 架构中,前后端组件的具体定位、运行空间是什么?该架构如何通过关键机制实现高效的数据传输?​

答案​

  • 前后端组件详情:​
  • 后端组件:vhost-net,运行于宿主内核空间,也被称为 vhost-net 驱动,是 virtio 接口的宿主侧实现。​
  • 前端组件:virtio-net,运行于客户机内核空间,也被称为 virtio-net 驱动,是 virtio 接口的客户机侧实现。​
  • 高效数据传输机制:​
  1. 数据面绕过 QEMU 进程:借助 vhost 协议,数据面可直接从宿主内核传输到客户机,无需经过运行在宿主用户空间的 QEMU 进程,避免了因 QEMU 进程带来的上下文切换开销(上下文切换会增加延迟并消耗更多处理时间)。​
  1. 共享内存区域:vhost-net 与 virtio-net 通过共享内存区域实现数据交换,无需额外的数据拷贝操作,减少数据传输过程中的性能损耗。​
  1. 专用 RX/TX 队列:数据的接收(RX)和传输(TX)通过专用队列完成,且队列按虚拟 CPU(vCPU)创建(如 4 个 vCPU 对应 4 组 RX/TX 队列),实现数据传输的并行处理,提升整体传输效率。​

问题 3:Open vSwitch(OVS)在 virtio-networking 体系中的作用是什么?其组成结构如何?在实际场景中,OVS 如何与物理 NIC、vhost-net 后端实现连接以完成数据包转发?​

答案​

  • OVS 的作用:作为软件交换机,OVS 负责在宿主内核内部实现数据包转发,将客户机通过 virtio-networking 接口传递到宿主内核的数据包,转发给同一宿主上的其他客户机,或转发到外部网络(如互联网),是 virtio-networking 体系中实现跨 VM、VM 与外部网络通信的关键组件。​
  • OVS 组成结构:​
  • 用户空间:包含 ovsdb-server(数据库,存储 OVS 配置数据)和 ovs-vswitchd(守护进程,管理和控制交换机)。​
  • 内核空间:包含 ovs 内核模块,负责数据面或转发面功能,是处理数据包实际转发的核心部分。​
  • 实际连接方式:​
  1. OVS 通过 Linux 端口实现连接,一个端口专门用于连接 OVS 内核转发面与物理 NIC,确保 OVS 能与外部网络进行数据交互。​
  1. 另一个端口用于连接 OVS 与 vhost-net 后端,进而通过 vhost-net 与客户机的 virtio-net 建立关联,实现 OVS 与 VM 内部应用的数据包传递。​
  1. 实际场景中,因存在多个物理 NIC 和多个运行的 VM,会对应创建多个 Linux 端口,分别连接多个物理 NIC 与 OVS、多个 vhost-net 后端与 OVS,以满足多设备、多 VM 的通信需求。

参考:

www.redhat.com/en/blog/int…