| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 网络虚拟化——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。 问题
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-user。 6. virtio与vhost如何在非虚拟化场景,没有qemu/kvm介入的情况下运行? 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的模拟实现。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 20:35:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |