当前位置:   article > 正文

网络虚拟化——vhost-user

vhost-user

在上一篇文章(网络虚拟化——vhost_dillanzhou的博客-CSDN博客)中,介绍了vhost技术和vhost-net内核模块的原理。通过将virtio设备后端的数据面功能转移到内核中,vhost-net避免了在qemu中实现后端所需的状态切换和系统调用,能够直接与内核协议栈或ovs交互完成网络通信。

随着虚拟网络规模的扩大,对虚拟网络处理性能的要求也在不断提高,在用户态通过DPDK框架实现高性能网络处理能力是当前的主流手段之一。以虚拟网络最常用的软件交换机open vswitch为例,ovs与DPDK结合形成ovs-dpdk,将数据面功能从内核态移到了用户态,减少了数据面和控制面的交互成本,从而大幅提升了交换性能。DPDK作为当前最流行的高性能网络处理技术,已经有大量网络处理技术与其结合,在用户态实现高性能的网络处理能力。

在网络交换处理能力被转移到用户态后,vhost-net就不再适用了,因为在内核态处理virtio设备数据后还是要将其转交给用户态的DPDK应用,在内核实现后端已经没有意义。因此在这种场景下,又得回到最初的方式:在qemu中实现virtio设备后端,再通过IPC将数据转交给DPDK应用,这个方案的性能显然也不能令人满意。在已经有过vhost kernel加速方案的情况下,很容易想到一个优化方案:在DPDK应用中实现vhost能力,从而在用户态也能达到跳过qemu,让guest virtio driver与外部网络栈高效通讯的效果。

DPDK中已经提供了对这个方案的实现支持,称作vhost-user。本文将介绍vhost-user的原理和实现。

本文参考了redhat介绍vhost-user的文章:A journey to the vhost-users realm

问题

  1. vhost-user如何初始化数据面信息?
  2. vhost-user如何和virtio驱动实现共享内存?
  3. vhost-user如何与virtio驱动间实现kick/notify事件通知?
  4. vhost-user与在qemu中实现的virtio后端有什么区别?
  5. 除vhost外,virtio驱动能否也运行在用户态?
  6. virtio与vhost如何在非虚拟化场景,没有qemu/kvm介入的情况下运行?

vhost-user

在上一篇文章中已经介绍过了vhost协议的主要用途,通过vhost协议主要下发virtqueue的内存布局和配置,以及用于前后端事件通知的eventfd。

对于vhost-user来说,初始化所需的信息和vhost-net是一样的。在使用vhost-user提供vhost能力时,qemu仍然会将这些信息传递给vhost-user,只是使用的传递方式不同。很容易想到,在用户态进程间同步数据,特别是同步fd,最方便的方式就是unix socket。

如上图所示,qemu一直拥有virtio-driver所分配的virtqueue的内存布局,因此很容易将其共享给vhost-user进程。值得注意的是virtio和vhost-user间的双向事件同步仍然需要KVM的参与。qemu在初始化时会将irqfd/ioeventfd同时发送给vhost-user进程和kvm模块,事件通知过程与vhost-net模式下基本相同,只是kvm唤醒/等待的不再是一个内核线程而是一个用户态线程。virtio驱动仍然通过设备IO和中断方式与后端设备同步,不感知后端实现方式的变化。

通过这种方式,DPDK应用(例如OVS-DPDK)可以直接获取操作virtio设备的virtqueue,无需经过任何其他队列中转,实现了主机DPDK应用与虚拟机网卡驱动的共享内存数据交互。这几乎已经是虚拟机网络交互的最优模式。

小结

与内核中实现的vhost-net相比,vhost-user的原理基本相同,可以看作是vhost-net的用户态DPDK化实现。最后看看文章开始时的问题:

1. vhost-user如何初始化数据面信息?

vhost-user通过unix socket与qemu进程通信,获取virtqueue的配置信息和内存布局,然后通过mmap实现和qemu/guest的共享内存通信。

2. vhost-user如何和virtio驱动实现共享内存?

如上,vhost-user获取virtqueue内存布局后,通过mmap实现共享内存。

3. vhost-user如何与virtio驱动间实现kick/notify事件通知?

在虚拟机模式下,vhost-user还是和KVM间通过eventfd互相通知事件。KVM再把virtio驱动的kick翻译成ioeventfd写,将vhost-user的irqfd写翻译成guest的irq中断。

4. vhost-user与在qemu中实现的virtio后端有什么区别?

理论上说差别不大,qemu也可以内置vhost-user的实现。只是如果在qemu中实现vhost-user,那么qemu还需要通过另一个队列和DPDK网络应用通信来收发网络数据,因此不如直接将vhost-user集成到DPDK网络应用中效率更高。

5. 除vhost外,virtio驱动能否也运行在用户态?

当然可以,DPDK提供的virtio的用户态驱动virtio-pmd。

6. virtio与vhost如何在非虚拟化场景,没有qemu/kvm介入的情况下运行?

在virtio-pmd的基础上,DPDK提供了virtio-user这个纯用户态的虚拟virtio设备实现。virtio-user可以和vhost-user/vhost-net在非虚拟化环境下交互。在这种模式下,已经不需要qemu/kvm提供virtio-pci设备模拟。virtio-user明确知道自己驱动的是一个纯软件模拟的virtio设备,仍然通过ioctl/unix socket方式将virtqueue配置和内存布局、以及eventfd发送给vhost-net/vhost-user。只是virtio-user现在也直接操作eventfd来实现kick/notify,因为没有了KVM/qemu的模拟实现。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/999112
推荐阅读
相关标签
  

闽ICP备14008679号