virtio-networking 2:vhost-net

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 实现的文章。

二、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...

相关推荐
bobz96519 小时前
Virtio-networking: 2019 总结 2020展望
后端
AntBlack19 小时前
每周学点 AI : 在 Modal 上面搭建一下大模型应用
后端
G探险者19 小时前
常见线程池的创建方式及应用场景
后端
bobz96519 小时前
virtio-networking 4: 介绍 vDPA 1
后端
柏油20 小时前
MySQL InnoDB 架构
数据库·后端·mysql
一个热爱生活的普通人21 小时前
Golang time 库深度解析:从入门到精通
后端·go
一只叫煤球的猫21 小时前
怎么这么多StringUtils——Apache、Spring、Hutool全面对比
java·后端·性能优化
MrHuang96521 小时前
保姆级教程 | 在Ubuntu上部署Claude Code Plan Mode全过程
后端
紫穹1 天前
008.LangChain 输出解析器
后端
苏三说技术1 天前
Token,Session,Cookie,JWT,Oauth2傻傻分不清楚
后端