virtio是一种I/O半虚拟化解决方案,ovs是一个虚拟交换机,利用软件的方式实现交换功能。本文将对virtio+ovs的转发原理进行介绍和并对其性能展开分析。
1. virtio和ovs介绍
传统数据中心的硬件服务器上运行着linux,linux使用硬件网卡收发包,硬件网卡连接的硬件交换机进行包转发实现服务器之间的互通。硬件网卡有broadcom、mellanox和intel等各种品牌,硬件交换机有H3C、cisco等品牌。
在云计算环境下,对计算资源进行了切分,服务器上运行的是一个个虚拟机,虚拟机也要有网卡实现互连互通,但虚拟机的网卡不是物理的,它通过虚拟的网卡连接到虚拟的交换机上,虚拟的交换机对同一个服务器上的虚拟机之间流量进行转发,如果虚拟交换机再连接到服务器的硬件网卡,那么虚拟机就可以和服务器外面通信了。
硬件网卡收包时,CPU先分配内存,然后告诉硬件网卡内存的地址,报文从硬件交换机出来后进入硬件网卡的队列,硬件网卡通过DMA功能把包从物理网卡搬运到内存中。然后中断CPU说报文收上来了,CPU处理中断,软中断执行内核协议栈处理,最后通知应用程序收包。
虚拟网卡是CPU模拟出来的,它的队列也是模拟出来的,就是服务器上的一块内存。要模拟DMA功能就得进行一次特殊的内存拷贝,从服务器上拷贝到虚拟机里,虚拟机运行在服务器上,用的也是服务器上的物理内存,相当于服务器上物理内存之间的拷贝,只是地址转换比较复杂。
应用程序调用发包时,内核协议栈模块分配一块内存,把用户态要发的内容拷贝到内核。然后经过复杂的协议处理,最后地址告诉硬件网卡说我要发包,你发完了告诉我一声,硬件网卡的DMA就把要发的数据从内存中搬运到物理网卡的队列中,然后告诉CPU说发完了,你可以回收内存了。
虚拟网卡发包和物理网卡发包类似,包从虚拟机中搬运到物理服务器内存中,然后经过软件交换机,最后从物理网卡出去。虚拟网卡有e1000、virtio等,为什么云计算环境最终选择了virtio?首先virtio提供了一种虚拟机和物理服务器数据交换的通用机制,虚拟网卡、虚拟硬盘、虚拟显卡和虚拟串口等都可以用。其次virtio分frontend和backend,frontend运行在虚拟机中,backend运行在物理服务器上,frontend和backend配合实现具体的网络功能,frontend和backend之间用virtio通用机制交换数据,设计巧妙。因此virtio得到了大多数hypervisor的支持,成了虚拟化事实上的标准。
硬件交换机是通过学习MAC进行二层转发的,使用STP协议防止环路出现,为了减小arp这样的广播风暴又增加了vlan隔离。软件交换机有linux bridge、vpp和ovs等。为什么云计算环境中大多使用ovs?因为云计算是最自然的SDN应用场景,不再需要复杂的控制面协议,如STP。另外云计算要求灵活,vpp pipeline和linux bridge设计时考虑更多的是二三层转发原理和转发性能,要加入新功能异常艰难,而ovs采用了openflow pipeline,多table和多group灵活跳转。pipeline设计考虑更多的是功能实现,性能方面由datapath支撑,并且datapath upstream到kernel中顺手就可使用,所以选择ovs。