DPDK系列之七DPDK中的虚拟化支持

一、DPDK和虚拟化

DPDK中大幅优化了网络通信的效率,这里也重点对网卡的虚拟化进行分析。在前面的文章中的学习可以判定网卡基本属于IO虚拟化。但是,虚拟化又有IO全虚拟化和IO半虚拟化之分,那么在DPDK中使用的哪种呢?IO虚拟化一般有全虚拟化、半虚拟化、透传和SR-IOV几种方式,这里重点比较前两者。
IO全虚拟化技术是由指令的翻译的全翻译来实现的,也就是说虚拟机可以模拟宿主机的的所有功能。但这样做有一个问题,它会导致上下文的切换降低效率。这时候,半虚拟化(又叫CPU虚拟化)技术就出现了,半虚拟化技术中虚拟机和宿主机并不是完全隔离的,它是在敏感指令上通过HyperCall调用来实现的,这样就节省了指令捕获和完整模拟提高了效率。
DPDK在PMD(Poll Mode Drivers)中通过virtio和vhost来实现IO的半虚拟化功能。

二、virtio 和vhost

1、virtio
在DPDK中,对virtio的支持已经到1.1的版本(virtio1.2版本也出来了)。virtio ,来源于《 towards a de-facto standard for virtual I/O devices》这篇论文当中。这篇论文提出了“两个通用的 ABI,Virtqueue和 Linux API for virtual IO device”,同时提供了对虚拟设备的向后兼容性以及Feautre协商机制。
virtio是一种接口规范,用来统一IO半虚拟化抽象。它提供了一套层应用与Hypervisor 虚拟化设备(KVM,Xen,VMware等)之间的通信框架和编程接口,大大减少了平台的兼容性差异。
一般来说,在宿主机上的虚拟机(客户端)上实现的IO半虚拟化的前半端驱动程序叫做virtio,而在宿主机host实现的后半端驱动程序叫做vhost。它们两个通过virtio的虚拟队列通信。虚拟机发送的数据报文到达虚拟交换机,再转发到物理网卡中。
virtio在PCI层上定义了virqueue,所以可以配置一个或者多个此类型队列保证数据的收发。
2、vhost
在内核怸中,vhost负责报文送达消息的通知中断。vhost-net做为上层应用和物理设备的桥梁,对相应的进出数据报文队列进行操作,并通知中断的产生。也可以把vhost-net迁移到用户态,即vhost-user,此时,vhost-user为第个VM创建一个端口,实现后端逻辑以及报文的收发请求。用户态的vhost-user数据的拷贝是由共享内在来实现的。
DPDK中就是使用的vhost-user机制。DPDK中的vhost支持字符设备和Socket服务两种消息机制,它主要是负责virtio-net的创建和管理以及销毁动作。它的封装形式主要有vhost lib和vhost PMD。前者实现了用户态的vhost驱动,而后者则是前者的封装进一步形成标准的虚拟端口。
vhost-net(内核态vhost)和vhost-user二者不同在于,前者是沟通用户态和内核内的接口而后者则通过域来处理共享内能达到同样的效果。

三、应用

virtio既可以处理IO也可以处理网络子系统,在DPDK重点是对网络子系统的应用。DPDK目前是VNF和NFC(网络功能虚拟化和容器化)的一个重要组成部分。在现在的云服务中,网络功能虚拟化已经是软件硬件解耦的一个重要部分,它可以做为各种网络功能的基础设施层(NFCi)有效支撑。
在实际的应用中,虚拟网络交换机是一个重要的应用,开源的有Open vSwitch(OVS),Snabb Switch等等。在开源的OPNFC中,还有很多的项目直接或者间接应用到了DPDK。毕竟,DPDK做为一个开发套件,理论上只要是有IO和网络数据通信的,都可以应用得到。
云的兴起,对VNF和NFC的要求是只有更高没有最高,而DPDK在这其中还有更多的事情要做,而且DPDK确实也在不断的增加着一些功能。这使得DPDK会更好的为VNF服务,降低成本,方便网络的弹性部署。

四、总结

最后再提一下透传和SR-IOV,前者效率非常好,可以简单理解为就是虚拟设备和物理设备合而为一了,但这样做的缺点就是不灵活。而后者是为了实现在单张物理设备上提供多个虚拟子设备的问题,DPDK也同样支持这两种方式(前提是硬件也要提供支持)。所以说一个好的框架,支持的力度是在尽可能的情况下要宽泛,这样才可以保证框架的可适用性并为广大开发者接受。

你可能感兴趣的:(C++11,网络开发,c++,网络)