之前的文章里,我们讨论了现存的virtio-networking架构,包括基于内核的(vhost-net/virtio-net)以及基于用户态DPDK的(vhost-user/vhost-pmd),现在我们需要转移我们的注意力到一个目标是让virtio-networking架构给VM提供有线连接速度的架构
本文将会涵盖构成这个架构的数据面以及控制面组件。我们将会介绍SR-IOV技术,以及这个技术如何提升网络性能。还会介绍virtio的硬件方案以及vDPA(virtual data path acceleration)带来的巨大好处。最后通过比较这些virtio-networking架构来做一个总结。
本文主要是为了那些有兴趣想了解不同virtio-networking架构的(包括vDPA),但不那么深入细节的人。当然后面也会提供一个技术细节的分享以及一个实践教程。
Data plane and control plane for direct access to NIC
在之前的vhost-net/virtio-net和vhost-user/vhost-pmd架构里,网卡都是接入在OVS kernel或者OVS-DPDK里的,而virtio的后端接口则是从OVS的另外一个port出去的
为了提升网络性能,直接把网络连到guest里,和之前的virtio架构类似,我们拆分了网卡的控制面和数据面:
- 控制面。提供网卡和guest之前的配置修改和特性协商功能,用来建立和销毁数据面通道
- 数据面。用来在guest和网卡之间传输数据包。当直接把网卡连接到guest的时候,实际上是要求网卡要支持virtio ring layout的
这个架构如下图所示:
笔记:
- 如果需要知道KVM,libvirt以及Qemu进程的额外信息,可以看前面的文章
- 数据面直接从网卡到guest,实际上是通过guest提供一个网卡可访问的共享内存实现的,并且并不经过host kernel。这个意味着网卡和guest都需要使用完全一致的ring layout否则就需要做地址翻译,地址翻译意味着性能损耗
- 控制面的实现则可能设计host kernel或者qemu进程,这个取决于具体的实现
SR-IOV for isolating VM traffic
在vhost-net/virtio-net和vhost-user/virto-pmd架构里,我们是用了软件交换机(OVS)可以让一个网卡对接到物理端口上,然后分发数据包到不同的虚拟机的端口上。
把网卡挂在虚拟机上最简单的方法就是硬件透传,也就是直接把一个网卡提供给guest kernel的驱动。
问题是我们需要在服务器上有一个单独的通过PIC暴露的物理网卡,接下来的问题就是我们如何在物理网卡上创建“虚拟端口”?
SR-IOV(Single root I/O virtualization)是一种PCI设备规范,允许共享一个物理设备给多个虚拟机。换言之,这个功能允许不同的虚拟环境里的虚拟机共享一个网卡。这意味着我们能够拥有一个类似把一个物理网卡拆分为多个以太网接口的功能,帮我们解决了上面提到的“虚拟端口”的创建问题。
SR-IOV有两个主要功能
- Physical Functions,即PCI设备的完整功能,包括发现,管理和配置功能。每个网卡都有一个对应的PF能提供整个网卡设备的配置
- Virtual Functions,是单个PCI功能,可以控制设备的一部分,并且是PF的子集。同一个网卡上能有多个VF
我们需要在网卡上配置VF,PF,VF相当于是虚拟接口,PF相当于是网络接口,举个例子,我们有一个10GB网卡有一个外部接口和8个VF。那么这个外部端口的速度以及双工是取决于PF的配置而频率限制则是VF的设置
hypervisor提供了映射virtual function到虚拟机的功能,每个VF都可以被映射到一个VM(一个VM可以同时有多个VF)
然后来看看SR-IOV是如何映射到guest kernel,用户态DPDK或者是直接到host kernel的吧
- OVS和SR-IOV: 我们使用SR-IOV给OVS提供多个物理面端口,比如配置多个单独的mac地址,虽然我们只有一个物理网卡,但可以通过VF实现。并且给每分配一段内核内存到特定到VF(每个VF都有)
- OVS DPDK和SR-IOV:跳过物理机内核,通过SR-IOV直接从物理网卡到OVS-DPDK。映射host用户态内存给网卡的VF
- SR-IOV + guests:映射guest内存到网卡,跳过所有物理机环节。注意:使用设备透传,ring layout在物理网卡和guest之间是共享的,因此特定网卡才能被使用,因为这个逻辑一定是网卡厂商提供的。
注意:当然还有不是很常见的第四个方案,就是透传设备给guest里的用户态DPDK应用。
SR-IOV for mapping NIC to guest
重点说一下SR-IOV到guest的情况,这里存在一个问题就是在直接映射内存到网卡的场景下,如何更高效的发包收包。
我们有下面两个方法解决这个问题:
- 使用guest kerel驱动:这个方法就是使用网卡厂商提供的kernel驱动,即直接映射IO内存,这样的话硬件设备就能够直接访问guest kernel的内存了
- 在guest里使用DPDK-pmd驱动:这个方法,就是使用网卡厂商提供的DPDK pmd驱动,运行在guest的用户态,能够直接映射IO内存,因此硬件设备也能够直接访问用户态的特定进程
这一段我们重点看看DPDP pmd驱动的方案,整合起来就是下面这个图:
笔记:
- 数据面是和厂商挂钩的直接访问VF
- 对SRIOV,网卡厂商的驱动需要在host和guest都装
- host内核驱动以及guest的pmd驱动并不直接互相访问,PF/VF的驱动是通过其他接口配置的(比如libvirt等)
- 厂商提供的VF-pmd需要负责网卡VF的配置而PF驱动则负责在host内核上管理好物理网卡设备
总结一下这个方案,我们可以通过SR-IOV + DPDK PMC的方式给Guest提供一个很好的网络性能,不过这个方法还是挺麻烦的。因为这个方法是和厂商绑定的,因此需要在guest和host跑一样的驱动,并且特定网卡。这意味着网卡硬件升级,虚拟机应用驱动也需要升级。如果网卡被替换成了另外一个厂商的网卡,那么guest也需要装一个新的pmd。同时迁移虚拟机则会要求host上配置完全一致。也就是说网卡需要版本一致,物理位置需要一致,并且厂家还要提供迁移支持。
因此我们要处理的问题就是如何使用标准接口实现SR-IOV的性能提升,最好是只需要标准驱动,把这个驱动问题从整个架构中解耦出来。
下面的两个方案就是来解决这个问题的
Virtio full HW offloading
第一个方案是virtio的硬件替代方案,把virtio的控制面和数据面都转移到硬件上,也就是说网卡(当然还是通过VF来提供虚拟接口),支持virtio控制面的标准,包括发现,特性协商,以及建立/销毁数据面,等等。这个设备也支持virtio rang layout,因此一旦内存在网卡和guest之间被映射了,他们就能够直接通信了。
这个方案里,guest能够直接和网卡使用PCI通讯吗所以没有必要使用额外的驱动。然而需要网卡厂商提供支持virtio标准的网卡,包括控制面的软件实现,一般来说都是操作系统实现的,这个情况就是需要网卡自己实现。
下面是硬件架构的图:
笔记:
- 实际上控制面需要的操作是非常负责的主要是和IOMMU以及vIOMMU,下篇文章里会说
- 实际上在host kernel,qemu进程还有guest kernel都涉及这个流程,图里面简化了
- 当然也可以吧virtio数据面控制面放到kernel里而不是用户态(和SRIOV的场景一致),也就是直接使用virtio-net驱动来和网卡通讯(而不是使用virtio-pmd)
vDPA - standard data plane
Virtual data path acceleration (vDPA) 是一个通过virtio ring layout和放置一个SRIOV在guest,来标准化网卡SRIOV数据面将这个网络性能改善和厂家实现解耦的方案,通过增加一个通用的控制面以及阮家架构来支持vDPA。提供一个抽象层,在SRIOV之上,并且给未来的可拓展IOV打好基础。
和virtio的硬件方案类似,数据面直接建立在网卡和guest之间,都使用virtio ring layout。然而每个网卡厂家可能就会提供各自的驱动了,然后一个通用的vDPA驱动就被添加到了kernel里面来完成常见网卡驱动或控制面之间的virtio控制面翻译工作。
vDPA是一个灵活性更高的方案,相比硬件方案来说,网卡厂家支持virtio ring layout的成本更小了,并且也能够达到性能提升的目的。
示例图如下:
笔记:
- 实际上在host kernel,qemu进程还有guest kernel都涉及这个流程,图里面简化了
- 类似SRIOV和virtio全硬件方案,数据面控制面都是在guest内核里而不是用户态(优劣和之前提到的一样)
vDPA有潜力成为一个权威的给虚拟机提供以太网接口的方案:
- 开源的标准:任何人可用,并且贡献标准,而不被特定的厂商限制
- 优异的性能:接近SRIOV,中间没有翻译成本
- 可以支持未来的硬件平台拓展技术
- 独立于特定厂商的标准驱动,意味着只需要配置一次驱动,而不用太关心网卡和版本
- 传输保护,guest直接使用单个接口。从host角度容易发现,并可以做好切换
- 在线迁移,提供不同网卡不同版本的在线迁移
- 提供一个标准的容器加速接口
- 裸机,提供标准的网卡驱动mvirtio网卡驱动可以被作为一个裸机驱动,当时用vDPA软件架构的时候,驱动这个驱动来适配不同网卡硬件
Comparing virtio architectures
总结一下之前的系列里我们学到的内容,包括四种提供给vm以太网络的架构,vhost-net/virito-net, vhost-user/virito-pmd, virtio full HW offloading 和 vDPA。
然后来比较一下他们的优劣:
总结
这篇文章我们包含了四种提供以太网接口的virtio-networking架构概览,包括速度慢的(virtio-net)到比较快的(vhost-user)还有最快的(virtio硬件方案和vDPA)
我们强调vDPA和SR-IOV相对其他技术来说的优势,也提供了四种技术的对比,接下来会更加深入的使用virtio硬件方案以及vDPA。