网络虚拟化——vduse

在上一篇文章《网络虚拟化-vDPA_dillanzhou的博客-CSDN博客》中,我们讨论了vDPA技术。通过vDPA技术,guest/host上的用户态/内核态virtio驱动都可以通过同一套vDPA框架和驱动来和vDPA设备交互,获得硬件数据面加速。由于vDPA在virtio/vhost和vDPA设备之间又增加了一层中间层,因此理论上说可以在vDPA框架中实现纯软件的vDPA设备和对应的驱动。这个软件vDPA设备可以在内核实现,intel就在内核中实现了一个vdpa_sim设备,用于在没有vDPA硬件设备的情况下验证vDPA框架的功能。这个软件vDPA设备也可以在用户态实现,字节跳动向内核添加了一个名为vduse的子系统,支持在用户态实现vDPA设备的数据面处理功能。vduse将在linux 5.15中被合入主线。

本文将讨论vduse的原理和使用场景。

问题

1. vduse有什么意义,在什么场景下可以用到?

2. 与vhost相比vduse有什么差别和优劣?

vduse

vduse是字节跳动向linux内核社区开源的用户态vDPA设备实现框架,将出现在linux 5.15内核中。

上图是vduse的实现原理示意图。结合vDPA的架构图可以看到,vduse实际上就是提供了一种vDPA设备的vDPA驱动实现,只是在这个vDPA驱动中并没有去配置物理vDPA设备,而是将virtqueue信息和控制面参数又通过devfs和ioctl接口传给了一个用户态的vduse实现进程,由这个进程去实现这个virtio/vhost/vDPA/vduse设备的具体功能。(理论上说,这个进程可以通过内核/用户态驱动再把数据发给物理硬件完成操作,当然这样没什么意义。)

devfs和ioctl的实现比较通用,基于这些接口实现配置信息传递也比较简单。virtqueue的内存地址在virtio驱动或vhost初始化的时候也可以在内核中获取到,比较容易映射给vduse访问。重点在于virtqueue中descriptor的数据buffer如何共享给用户态的vduse进程访问。从图中可以看到,两种不同的vDPA使用模式下,vduse获取virtqueue buffer内存的方式是不同的。

在VM场景下,virtio driver在用户态,virtqueue和buffer内存也在用户态分配,这时vduse进程可以和qemu进程通过mmap的方式共享内存,从而共享virtqueue和buffer的内存。这里有个问题,vduse进程用来mmap qemu进程的fd和地址段信息是哪来的?似乎仍然需要qemu进程参与这个内存映射过程?与作者确认了这个问题,qemu的virtio device实现对vdpa设备类型是有感的,在vdpa设备由vduse实现时,会提供共享内存的fd,vduse进程通过mmap这个fd来获得buffer的地址空间。这里需要注意的是vduse进程需要为共享内存映射与qemu中完全相同的地址空间,才能正确访问buffer内存。

在容器场景下,virtio driver在内核态,virtqueue和buffer也在内核态分配,这时vduse内核驱动会为用户态进程维护一个iotlb页表。用户态进程访问buffer地址时,MMU可以通过这个页表翻译出buffer地址对应的物理地址。但这里也有个问题,这个iotlb在什么时候更新?内核driver分配新的buffer并写入virtqueue时,vduse驱动不一定能立即感知到这个行为,如何保证iotlb中有这个buffer的地址映射?应该是这里分配buffer内存后会映射dma地址,在这个映射操作中包含了iotlb的更新操作。

通过上述方式,virtio设备的控制面和数据面配置信息同步到了vduse daemon进程中,之后vduse daemon就可以访问virtqueue来处理设备的数据收发操作。vduse daemon作为一个软件virtio设备,也需要kick操作和中断注入操作,vduse的kick通过监听预先注册到vduse驱动中的eventfd来实现,而中断注入则通过特定的ioctl操作实现。

小结

本文简单介绍了vduse的实现原理。最后来看一下相关的问题:

1. vduse有什么意义,在什么场景下可以用到?

vduse提供了一种在用户态实现vDPA设备,其实就是virtio设备的方式。通过这种方式,可以通过相同的后端实现为容器和虚拟机提供标准的virtio设备。其实这里的通用性意义不大,容器和虚拟机部署在一台物理机还需要相同后端实现的场景非常稀有。vduse最大的用途在于支持了host上的容器使用软件实现的virtio设备。在容器不感知后端实现,使用标准内核接口的情况下,可以在用户态处理容器应用的网络/IO操作。字节对vduse的使用场景是用于向容器和虚拟机以virtio-blk形式提供一个网络存储设备,业务的存储IO读写操作在vduse daemon中转化成网络读写操作。与另一种经典的用户态存储IO实现方式——fuse文件系统(https://blog.csdn.net/dillanzhou/article/details/82856358)相比,通过vduse的实现从逻辑清晰度和性能上都有明显的优势。当然virtio-blk是块存储设备,与fuse文件系统不能直接对应,但换成virtio-fs与fuse比较,结论仍然成立。

2. 与vhost-user相比vduse有什么差别和优劣?

在大部分场景下,vduse的功能都可以用vhost-user代替,例如VM场景。vhost-user与vduse的数据面处理效率基本是相同的,都是通过virtqueue直接共享内存交互。但显然vhost-user的kick和irq路径要比vduse短一些,性能也会更好一些。vduse的优势还是能通过一种尽可能透明、无感知的方式为host上的应用或容器提供虚拟设备。不过理论上说,也完全可以不通过vdpa/vduse的方式,通过一些更直接的内核接口配置,让vhost-user可以处理内核中虚拟的virtio设备操作。从这个角度看,vduse的优点是复用了内核已有的vDPA框架,不需要再增加一套内核虚拟设备框架。

vduse另一个理论上的优点是可以与vDPA物理设备协同工作,在有vDPA设备的机器上作为vDPA的备选设备实现,一旦vDPA设备故障或不可用时可以将virtio设备的后端切换到vduse实现上,保证VM或容器可以继续运行。不过这个场景能遇到的可能性似乎更少,为了这么罕见的场景开发和部署vduse的可能性不大。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值