用户态vdpa设备vduse简介及结合QEMU源码分析
本文链接: https://cloud.tencent.com/developer/article/2436757
术语
vduse: VDUSE(vDPA Device in Userspace) 用户态vdpa设备
VDUSE 简介:virtio 软件定义的数据路径
2022 年 7 月 14 日 谢永吉, 王杰森
标签: 存储 虚拟化
用户空间中的 vDPA 设备 ( VDUSE ) 是一种为虚拟机 (VM) 和容器工作负载提供软件定义存储和网络服务的新兴方法,vDPA(virtio 数据路径加速)内核子系统是 VDUSE 背后的引擎。不熟悉 vDPA 内核框架,请参阅我们的vDPA 内核框架和用于内核子系统交互的 vDPA 总线驱动程序简介博客,以熟悉vDPA 总线、vDPA 总线驱动程序和vDPA 设备等概念,因为我们假设读者很熟悉以及本博客中的这些主题。
简而言之,VDUSE 使您能够在用户空间中轻松实施软件模拟的 vDPA 设备,以服务虚拟机和容器工作负载。
vDPA 最初是为了帮助在专用硬件(例如 smartNIC)中实现virtio(一种开放标准控制和数据平面)而开发的,这只需要在硬件中支持 virtio 数据平面,并使用 vDPA 将供应商特定的控制平面转换为 virtio 控制平面。(显着简化供应商的工作)。
VDUSE 已发展为提供基于软件的 vDPA 设备(相对于之前的硬件 vDPA 设备),该设备可以利用 vDPA 内核子系统为虚拟机和容器工作负载提供标准接口,这对于优化的用户空间应用程序(例如存储性能开发)非常有用。套件 (SPDK) 和数据平面开发套件 (DPDK) 应用程序需要高效的接口来连接到计算机上运行的所有工作负载(虚拟机和容器)。
与硬件 vDPA 实现相比,vDPA 用户空间设备具有以下优点:
- 快速灵活的开发:您可以利用大量用户空间库并重用 QEMU 和 rust-vmm 中的设备模拟代码。
- 提高可维护性:例如,对用户空间应用程序执行实时升级比对内核模块或硬件执行实时升级更容易。
- 易于部署:没有硬件限制,用户空间应用程序可以轻松集成到云原生基础设施中。
- 强大的生态系统:可以将现有的用户空间数据平面(例如 SPDK 和 DPDK)用于虚拟机和容器。
本博客介绍了 VDUSE 架构,并回顾了几个演示其用法的示例。
VDUSE架构
VDUSE的基础设施包括两个关键块:位于用户空间的VDUSE守护进程和位于内核的VDUSE模块。
图片
图 1:VDUSE 内核模块和用户空间守护进程
VDUSE 守护进程负责实现用户空间 vDPA 设备,它包含设备模拟和 virtio 数据平面。
- 设备模拟负责模拟 vDPA 设备,它包含两个主要功能:
- 设备初始化和配置是通过VDUSE模块提供的ioctl()接口完成的。
- 处理运行时控制消息,例如设置设备状态,是通过read()/write()接口实现的。
- virtio dataplane负责处理来自 virtio 设备驱动程序的请求,该请求的数据缓冲区应提前通过 mmap() 接口映射到用户空间。
内核中的VDUSE模块负责桥接VDUSE守护进程和vDPA框架,以便用户空间vDPA设备可以在vDPA框架下工作,它包含三个功能模块:
- VDUSE 使用char 设备接口将 vDPA 配置操作和内存映射信息中继到用户空间,它通过使用 ioctl()、read()、write() 和 mmap() 等用户空间接口来实现。
- vDPA 设备将VDUSE 模块连接到 vDPA 框架,通过将其附加(通过实现通用 vDPA 总线操作)到 vDPA 总线,VDUSE 模块可以接收来自 vDPA 框架的控制消息,然后 VDUSE 模块可以对其进行处理。将其放置或转发到 VDUSE 守护程序。
- 基于内存管理单元**(MMU) 的软件输入/输出转换后备缓冲区 (IOTLB)**使 VDUSE 守护进程能够访问内核空间中的数据缓冲区。它实现了**反弹缓冲**机制,以便用户空间可以安全地访问数据。
VDUSE 对容器的支持
VDUSE 容器支持的关键点是用户空间 vDPA 设备所附加的 vDPA 总线驱动程序。目前,vDPA 内核框架支持两种类型的 vDPA 总线驱动程序:virtio-vdpa(用于容器)和vhost-vdpa(用于虚拟机, 如QEMU中的GUEST)
如果您想通过 VDUSE 为容器工作负载提供接口,则 vDPA 设备应与 virtio-vdpa 绑定(如下所示)。
图 2:通过 VDUSE 提供容器工作负载
在这种情况下,virtio-vDPA 总线驱动程序提供了一个 virtio 设备,可以将各种内核子系统连接到该 virtio 设备以供用户空间应用程序使用。
如前所述,为了使用户空间 VDUSE 守护进程能够访问 virtio 设备驱动程序中的数据缓冲区,在数据平面的 VDUSE 内核模块中引入了具有反弹缓冲机制的基于 MMU 的软件 IOTLB。
数据从内核空间中的原始数据缓冲区到反弹缓冲区并返回,具体取决于传输方向,然后用户空间守护程序只需将反弹缓冲区映射到其地址空间,而不是原始地址空间,这可能会发生。在同一页中包含其他私有内核数据。
VDUSE 对虚拟机的支持
如果 vDPA 设备与 vhost-vdpa 绑定,则 VDUSE 守护程序可以为虚拟机工作负载提供服务,如下所示。
图 3:通过 VDUSE 提供虚拟机工作负载
在这种情况下,虚拟主机 (vhost) 设备由 vhost-vDPA 总线驱动程序提供,因此它可以用作在 VM 内运行的 virtio 驱动程序的 vhost 后端。
共享内存机制: 在数据平面中,VM 的内存将与 VDUSE 守护进程共享,这样,VDUSE 守护进程可以直接访问驻留在用户空间内存区域中的数据缓冲区,而无需依赖反弹缓冲机制。
VDUSE端到端解决方案
现在您已经熟悉了 VDUSE 如何连接到容器和虚拟机工作负载,接下来看一下为这两种工作负载类型提供服务的整体解决方案。
图4:VDUSE架构概览
在图 4 中,核心组件 — VDUSE 守护进程(用户空间)和 VDUSE 模块(内核) — 用红线勾勒出轮廓。
VDUSE 用户空间守护程序可以通过将 VDUSE 内核模块创建的 vDPA 设备绑定到不同的 vDPA 总线驱动程序,为容器或虚拟机工作负载提供软件定义的存储和网络服务。
VDUSE 用例
以下用例演示了VDUSE 有价值的两种示例。
使用 VDUSE 访问远程存储
计算和存储分离的架构意味着您通常需要一种从计算节点中的虚拟机和容器访问远程存储服务的方法,VDUSE 为这种情况实现了可靠的解决方案。
图 5:用于远程存储访问的 VDUSE 解决方案
VDUSE存储守护进程是整个解决方案的核心组件,它使用VDUSE框架来模拟vDPA块设备,然后通过网络将来自VM或容器的I/O请求转发到远程存储。
与其他解决方案相比,VDUSE 方法:
- 提供服务于虚拟机和容器工作负载的统一存储堆栈。
- 提供比现有解决方案更好的性能,例如用于容器工作负载的网络块设备 (NBD),这是因为数据平面的 VDUSE 方法基于共享内存通信,其系统调用和数据副本较少。
启用 SPDK 应用程序来为容器提供服务
您还可以使用 VDUSE 启用专注于 VM 工作负载的现有 SPDK 应用程序(使用虚拟主机用户界面),为容器工作负载提供相同的服务,图 6 显示了其工作原理。
图 6:为容器重用 vhost-user 解决方案
上面介绍了一个 VDUSE Agent 代理来桥接容器和 SPDK 守护进程,一方面,它使用 VDUSE 框架来模拟绑定到 virtio-vdpa 总线驱动程序的 vDPA 块设备,另一方面,它充当 vhost用户客户端(vhost-user-client)与 SPDK 守护程序中的 vhost-user-server进行通信。
通过 VDUSE 框架,VDUSE 代理可以获取 virtio-blk 设备驱动程序数据平面中使用的内存区域(包括可用环、已用环、描述符表和包含 virtio 请求数据的反弹缓冲区)。
然后,通过 vhost-user 协议,VDUSE 代理可以将它们传输到 SPDK 守护程序,因此,当现有 SPDK 数据平面遵循 virtio 规范访问这些内存区域时,它会访问内核 virtio-blk 设备驱动程序中的数据。在此流程中,VDUSE 模块负责将数据到反弹缓冲区或从反弹缓冲区数据(MMU和软件IOTLB机制)。
总结
- VDUSE 是基于 vDPA 的新内核框架,它使您能够在用户空间中模拟软件 vDPA 设备。
- 该技术旨在提供一种新的用户空间方法,用于提供服务于容器和虚拟机工作负载的存储和网络服务。
- 存算分离: 容器和虚机场景, 结合SPDK和vhost协议, MMU/IOTLB/弹跳缓冲区等机制, 支持拉远存储
作者简介
谢永继
软件工程师,字节跳动
YongJi Xie 是字节跳动的软件工程师,致力于 QEMU 和 Linux 内核中的 I/O 虚拟化主题。
王杰森
首席软件工程师
经验丰富的 Red Hat 高级软件工程师,具有在计算机软件行业工作的经验。Linux virtio、vhost 和 vdpa 驱动程序的共同维护者。
阅读完整的简历
VDUSE源码分析
内核驱动-模块加载
|
|
管理设备回调和DMA回调
|
|
vdpa_config_ops VDPA配置操作回调函数
|
|
内核态创建块设备及IOCTL回调函数/vduse设备回调函数:
|
|
QEMU侧源码分析
|
|
QEMU调用栈, 导出vduse块设备, 创建块设备:
|
|
SPDK与VDUSE
整体架构
[RFC]vduse:vduse 服务的 SPDK 后端:
Vduse 是一种高效的方法,可将存储服务导出到本地主机,供容器和其他进程使用。其 umem 注册扩展已合并到 Kernel 6.0 中。virtio-blk 相关代码与 vhost-blk 重复,在进一步重构 virtio-blk-tgt 后应删除重复代码。
|
|
参考
VDUSE简介-virtio 的软件定义数据路径: https://www.redhat.com/ja/blog/introducing-vduse-software-defined-datapath-virtio
网络虚拟化——vduse: https://blog.csdn.net/dillanzhou/article/details/121689985
SPDK VDUSE: https://review.spdk.io/gerrit/plugins/gitiles/spdk/spdk/+/3ab3bf7d382e8137fc1b25b4cb69ce7d1d9ffa92
基于SPDK的Ublk和Vduse的用户空间块服务: https://blog.csdn.net/weixin_37097605/article/details/137362344
晓兵(ssbandjl)
博客: https://cloud.tencent.com/developer/user/5060293/articles | https://logread.cn | https://blog.csdn.net/ssbandjl | https://www.zhihu.com/people/ssbandjl/posts
https://chattoyou.cn(吐槽/留言)
DPU专栏
https://cloud.tencent.com/developer/column/101987
技术会友: 欢迎对DPU/智能网卡/卸载/网络,存储加速/安全隔离等技术感兴趣的朋友加入DPU技术交流群
weixin: ssbandjl
公众号: 云原生云
- 原文作者:晓兵
- 原文链接:https://logread.cn/post/linux/qemu_vdpa_vduse/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。