英特尔使用VT-d,AMD使用新的IOMMU技术解决了这个问题,I/O集线器将虚拟或客户机OS假物理地址紫色)转换成真实的物理地址蓝色)。新的IOMMU通过给不同的设备分配不同的物理内存子集,实现了不同I/O设备相互隔离。

虚拟服务器很少使用这项功能,因为它使虚拟机迁移变成不可能完成的任务,相反,它们是从底层硬件解耦虚拟机,直接将VM分配给底层硬件,因此AMD IOMMU和英特尔VT-d技术单独使用没有多大用处,这仅仅是I/O虚拟化难题的1/3。

第二步:多队列

接下来是使网卡变得更强大,而不是让Hypervisor对所有接收到的数据包进行排序,然后再发送给正确的VM,网卡变成一个完整的硬件开关,将所有数据包排序后放入多个队列,每个VM一个。

图 6 虚拟机多队列传输

图 6 虚拟机多队列传输

更少的中断和CPU负载。如果让Hypervisor处理数据包交换,这意味着CPU 0要被中断,检查接收到的数据包,并确定目标VM,目标VM和相关的CPU立即中断,使用网卡中的硬件开关,数据包被立即发送到正确的队列,相关CPU立即中断,并开始接收数据包。

更短的延迟。单个队列负责接收和转发多个VM的数据包会受不了,因此可能会出现丢包,让每个VM拥有自己的队列,吞吐量更高,延迟更低。

虽然虚拟机设备队列Virtual Machine Devices Queues)解决了许多问题,但仍然还有一些CPU开销存在,每次CPU中断时,Hypervisor必须从Hypervisor空间将数据复制到VM内存空间。

最后的难题:SR-IOV

最后一步是给你多个队列设备中的每个队列添加一些缓冲区和Rx/Tx描述符,单块网卡可以伪装成数十个"小"网卡,这也是PCI SIG做的工作,它们称每个小网卡为一个虚函数virtual functions,VF),根据PCI SIG SR-IOV规范,每块网卡最大可以提供256个虚函数注意:SR-IOV规范不限于网卡,其它I/O设备也可以有SR-IOV功能)。

图 7 具有SR-IOV功能的网卡可以创建多个虚函数 

图 7 具有SR-IOV功能的网卡可以创建多个虚函数


相关内容