IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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

问题

  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-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的模拟实现。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:13:03  更:2021-10-24 15:13:12 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码