王志宏,Intel工程师
三个话题
在刚刚结束的FD.io minisummit上,有三个话题是关于虚拟化数据通道协议性能探讨的:
1. Towards a single virtualized data path for VPP
2. High Speed Solutions in VPP to Accelerate Container Networking: Howto and Deep Dive
3. VPP performance tuning from the perspective of virtual networking
三个对比
目前主流的高性能虚拟化数据通道基本都是基于内存共享机制,例如Virtio和Netmap。VPP中实现的SSVM也是基于内存共享机制,目前还没有推出正式的标准。
对这些协议进行性能分析和对比是一个很有意思的话题。
关于性能的讨论分为两部分:协议开销,和数据拷贝开销。协议开销包括通信两端对ring、desc、index的维护;数据拷贝开销则是真正将需要传输的数据从发送发拷贝到接收方。
基于内存共享机制的数据传输通常会有ring、desc、index等数据结构,用于通信双方确定收发的位置和状态,我们可以用一个提水的例子来快速理解其中的原理。
假设有两个人分别有一个水池,其中A需要将自己水池中的水用水桶传给B,B将接收到的水倒进自己的水池。
对于Virtio协议,A和B中的一个人作为前端的角色,另一个为后端。前端负责管理所有的水桶。假设B是前端,那么A需要向B申请水桶,然后打水,再将水桶递给B。反之,如果A是前端,那么他直接可以用水桶装水,然后递给B,最后B将空桶还给A。
对于Netmap协议,A和B都有很多水桶。A只需要从自己空桶中拿出一个,装满水,B则从自己的空桶中拿出一个,然后A和B进行互换,则完成了一次水的传递。此外,在Netmap的设计中,A和B的水池实际上在同一个地方,因此这个互换操作开销非常低。
对于SSVM,A和B都没有自己的水桶,而在他们之间有一堆水桶。这时,A需要从这一堆水桶中取出一个空桶,装满水,然后传递给B。反之亦然。这个过程中由于A和B有可能同时取到同一个空桶,因此取水桶这个操作需要加锁。
当然,这个比喻反映的是协议的大体设计思路,其描述对于真实协议的具体实现细节来说不够精确。
一个结论
在我们初步的测试中,对于64B的小包,Netmap的性能最好,这是由于它的收发操作最简单,协议开销最小,而Virtio和SSVM都还有提升的空间。随着包大小的增加,数据拷贝开销的比例逐渐升高,各种协议的性能也趋于一致。
如果从发展的角度来看,所有的基于内存共享机制的虚拟化数据交换协议,如果持续进行优化,其协议开销都会趋于最小化,最终接近一致。这个优化的过程,就是对传输协议的数据结构和收发操作进行改进的过程,以使其具有更简单的操作,更亲和硬件执行的状态维护。或许最终所有这些协议的数据结构和收发操作都会变得大同小异。
网络相关的功能性方面,Virtio支持较多的offloading功能,例如TSO、checksum,而Netmap和SSVM暂时不支持这些功能。
在这三个协议中,Virtio拥有标准的协议文档,具有很好的实现兼容性。DPDK中实现了Virtio/Vhost的库,并且通过Vhost PMD将其抽象成一个标准端口,简化了使用。同时,DPDK持续对Virtio/Vhost进行优化,并积极对下一代Virtio协议进行探讨以提升功能和性能,希望通过Virtio/Vhost来加速所有的vSwitch。
被广泛应用的OvS(Open vSwitch)通过集成DPDK,性能得到了数倍的提升。目前DPDK团队也正在将 Vhost PMD集成到VPP中。
同时,通过在Container中引入一个Vhost-user适配器来代替虚拟机中的PCI驱动,DPDK成功地将Virtio PMD引入Container进行网络加速。