DPDK vhost-user研究(二十五)

Virtio/Vhost是什么

Vhost/Virtio是一种半虚拟化的设备抽象接口规范, 在Qemu和KVM中的得到了广泛的应用,在客户机操作系统中实现的前端驱动程序一般直接叫Virtio, 在宿主机实现的后端驱动程序称为Vhost。与宿主机纯软件模拟I/O相比,virtio可以获得很好的性能,在数据中心中得到了广泛的应用。

Vhost有两种实现:内核态和用户态

内核态实现

在这里插入图片描述
vhost_net将部分的Virtio驱动从用户空间(其实是QEMU中)移到了kernel中,从而跳过QEMU,减少QEMU和内核之间的上下文切换开销,从而提升网络IO的性能。

通过在内核态增加了一个vhost驱动,与virtio相比,只需要进行一次用户态内核态切换(因为内核态的vhost-net.ko可以直接访问内核态的TAP设备,少了一次切换),另外,由于引入vhost技术共享了虚拟机的网卡缓冲区也省了一次数据拷贝(vhost-net.ko充当vhost backend,kvm.ko充当vhost client)。

用户态实现

vhost_user是将vhost_net驱动移动到用户态来实现零切换和零拷贝,从而进一步提升性能。一些实现了vhost backend的交换机(如snabbswitch)直接在用户态从vhost共享的虚拟机网卡缓存区virtio-ring中把网络数据进行读取,然后snabbswtich又实现了SR-IOV的物理网卡驱动直接将读到的虚拟机网络数据送到物理网卡上,从而大大提升了性能。
在这里插入图片描述

DPDK的实现

dpdk对虚拟化环境也是一个逐步支持的过程,不同的版本实现的功能不尽相同,具体的发展历程可以参考下图:

在这里插入图片描述从最初版本的guest virtio PMD + kernel vhost_net发展至今,主机端实现用户态的vhost user,guest端采用virtio PMD。架构已经基本定型,后期的工作主要集中在性能优化和稳定性两个方面。用户态的vhost其原理和内核态的vhost-net类似,实现了用户态API,卸载了QEMU在Virtio-net上所承载的虚拟队列功能,同时基于QEMU共享内存空间、虚拟化队列的访问地址和事件文件描述符,使得vhost能够进行报文处理以及与guest通信。

DPDK的vhost包含的基本功能有:

  • virtio-net网络设备管理,包括设备的创建和销毁
  • 虚拟队列中描述符列表、可用环表和已用环表在vhost进程的虚拟地址空间的映射和解除,以及实际的数据报文缓冲区的映射和解除
  • 收到报文时,通知guest;发送报文时,接收来自guest的消息通知
  • 虚拟队列和实际的物理网卡间的报文交换。可使用VMDQ机制对报文进行分类和排序,避免软件方式的报文交换
  • virtio-net后端设备的实现以及部分新特性实现:如支持多队列,TSO,支持巨型帧等等

先看下OVS+DPDK的概念,传统的vSwitch要使用kernel来完成转发面的实现以及和物理NIC的对接;在OVS+DPDK方案中,完全bypass 内核,通过dpdk + PMD来实现之前kernel提供的功能,从而将所有的功能都一直到用户态来实现。

在这里插入图片描述基于这样的方案来实现的VNFs示意图就可以如下:
在这里插入图片描述
在这里插入图片描述
扩散:

当然除了上述VNFs部署方式,还可以采用下面的方式来部署:
在这里插入图片描述
这种部署方式需要NIC支持SR-IOV,同时在VNF中运行VF PMD。 这种方式的优点是性能高,相当于直接从物理网卡中读取报文;缺点是对硬件有依赖,而且动态迁移比较麻烦。

来比较下在云环境不同实现方式路径(性能从左到右逐渐提升):
在这里插入图片描述

参考链接:https://www.redhat.com/en/blog/boosting-nfv-datapath-rhel-openstack-platform

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章