在上一篇文章(网络虚拟化——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的模拟实现。

网络虚拟化——vhost-user相关推荐

  1. 网络虚拟化——vhost

    在上一篇文章(网络虚拟化--virtio)中,我们讨论了virtio技术的由来.原理和实现.virtio为虚拟IO设备提供了一套标准的接口和实现.同时由于其半虚拟化的特质,virtio驱动在设计和实现 ...

  2. 网络虚拟化——SR-IOV

    之前的多篇文章介绍了网络虚拟化常见的技术实现,特别是virtio/vhost技术的实现.虽然virtio/vhost架构显著改善了虚拟网络的性能,但virtio网卡仍然是软件模拟的设备,其性能稳定性和 ...

  3. 网络虚拟化——virtio

    前言 在上一篇文章(网络虚拟化--QEMU虚拟网卡)中,讨论了经典的网络设备全虚拟化技术.这种技术不需要guest内核对虚拟网络设备有任何的感知和特殊处理,但性能较差,一次读写操作可能会产生多次需要H ...

  4. 网络虚拟化——vduse

    在上一篇文章<网络虚拟化-vDPA_dillanzhou的博客-CSDN博客>中,我们讨论了vDPA技术.通过vDPA技术,guest/host上的用户态/内核态virtio驱动都可以通过 ...

  5. KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)

    网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...

  6. 华为dra路由方式分为relay和proxy_华为云计算(3)——网络虚拟化

    ​关注微信公众号IT小组,获取更多干货知识~ 一.网络虚拟化 网络虚拟化在介绍网络虚拟化之前,需要考虑一个问题--为什么需要网络虚拟化呢?之所以要对网络进行虚拟化,是因为在没有进行虚拟化之前,每个服务 ...

  7. 【微软公有云系列】Hyper-v(WinSer 2012 R2)网络虚拟化(三)租户隔离

    前两章讲了挺多的理论知识,是希望让大家有一点了解,对网络基础不太好的朋友们或许看的会有点(◎﹏◎),不过不要紧,心里大概有个概念就行,接下来的会带给大家一些动手实践的Demo,加深大家对网络虚拟化(N ...

  8. Linux 虚拟化网络技术 — KVM + Linux Bridge 的网络虚拟化解决方案

    目录 文章目录 目录 KVM 虚拟机应用 Linux Bridge + VLAN 实现网络隔离 TSG: Failed to restart network KVM 虚拟机应用 Linux Bridg ...

  9. 网络虚拟化是否需要额外的网络架构?

    这是否是一个绝对的要求?不是.你是否需要一个网络架构来有效运作?在某些时候也许是这样,但事实是,你不需要任何花哨的VXLAN隧道功能也可以在相对传统的以太网交换机中部署网络虚拟化覆盖.对于小型或地理分 ...

最新文章

  1. python123期末测验答案程序题_python期末题库(2)带答案
  2. 同时读取两个USB摄像头采集
  3. ubuntu20.04安装搜狗输入法(社区版+个人版)
  4. 精通Spring Boot——第十一篇:使用自定义配置
  5. Abp vNext异常处理的缺陷/改造方案
  6. 自然语言处理领域基本概念笔记
  7. Aspose转PDF时乱码问题的解决
  8. matlab离散傅里叶逆变换,手动实现离散傅里叶正变换与逆变换(程序+例子)
  9. html5语义化编程,HTML5常用的语义化标签
  10. 华为已捐献 HarmonyOS 全部基础能力;腾讯、字节跳动隔空互怼;人人视频从App Store下架整改|极客头条...
  11. 【踩坑】activiti工作流的svg-xml解析报错
  12. Profiler中WaitForTargetFPS详解【转】
  13. ListView的headerView下拉刷新PullToZoomInListView分析
  14. 新版中日交流标准日本语多媒体版(全25CD)下载
  15. 电脑缺少网卡驱动不能上网
  16. 华为mate xs拍照怎么用?镜像智拍助你告别大饼脸
  17. 《读者》的“卷首语” (五)
  18. 2015年8月5日------------赵鑫
  19. 英文 SCI 论文写作常用句式(保持更新)
  20. 超有趣的Python实战:将图片转成像素风!

热门文章

  1. MySQL架构原理(七)集群架构和主从模式部署
  2. Dux主题 V6.4 新增百度收录
  3. 浅谈web cache的简单原理
  4. 《离散数学及其应用》读书笔记【三】计数
  5. 洛谷P1046 陶陶摘苹果c语言
  6. Oracle建表不设主键,oracle建表,设置主键,修改属性等
  7. 数据库IP网络切换问题
  8. HTML作业-我的大学生活
  9. 1024程序员节,祝大家节日快乐,NoBug!
  10. Linux下修改EXT2/EXT3/EXT4文件系统的磁盘卷标的方法