1、SR-IOV介绍
Single Root I/O Virtualization(SR-IOV) 是一种由PCI-SIG 组织发布的I/O 虚拟化技术标准。SR-IOV 采用直接I/O 技术,绕过虚拟机监视器直接发送和接收I/O 数据。同时SR-IOV 还利用IOMMU(I/OMemory Management Unit)高效完成内存访问授权和内存地址转换。一个SR-IOV 设备具有一个或多个物理设备(Physical Function,或PF),PF 是标准的PCIe 设备。每一个PF可以创建多个虚拟设备(Virtual Function,或VF),VF 是“轻量级”的PCIe 设备。
Physical Function (PF) : 网卡上的每个实体端口具有至少有一个PF。在某些情况下,网卡上的每个端口可以被分割为四个端口。例如每个端口可成分为四个PFs,或是在双端口的网络卡上能分割为总共有八个PFs。关键点是在于PF拥有完整的设置能力,它们可以被hypervisor当成是实体端口来管理。
Virtual Function (VF) : VF是和VM关联的,它被限制为处理I/O流,基本上是移动数据。它们不支持对实体端口的管理。所支持的VF数不同但约莫是每张卡可虚拟为64个VF。
每一个VF 拥有收发数据包的关键资源,如收发队列、DMA 通道等;而与其他VF 共享其他大部分非关键的设备资源。因此每一个VF 都有独立收发数据包的能力。若把一个VF 分配给一台虚拟机,该虚拟机就具备了直接使用该VF 进行数据包发送和接收的能力。最为重要的是,虚拟机通过VF 进行I/O 操作无需虚拟机监视器的干涉,这正是直接I/O 技术的优势之一。
2、SR-IOV体系结构
如图,SR-IOV 体系结构中的软件部分包括:PF 驱动、VF 驱动和SR-IOV 管理器(IOVM)。在XenServer的环境下,PF 驱动运行于Domain0,VF 驱动运行于DomainU。
PF 驱动运行在宿主机并且有访问所有硬件设备资源的权限。PF 驱动的主要功能和职责是创建、配置和管理虚拟设备,即VF。
VF 驱动相当于一个普通的网络设备驱动运行在虚拟机,VF驱动只有操作相应VF 的权限。VF 驱动的主要功能和职责是在虚拟机和VF 之间直接完成I/O 操作,包括数据包的发送和接收。由于VF 并不是真正意义上的PCIe 设备,因此VF 也不能像普通的PCIe 设备一样(如PF)被操作系统直接识别并配置。
SR-IOV 管理器运行在宿主机,它为所有的VF 创建了一个虚拟的配置空间,使得宿主机操作系统可以正确的识别并配置VF。在VF 被宿主机正确的识别和配置之后,它们才能被分配给虚拟机,然后在虚拟机操作系统中被当作普通的PCI 设备初始化和使用。
如图,SR-IOV 以太网控制器包括了一个内置的链路层交换机,一个PF 和多个VF。
链路层交换机进入网卡的数据包首先经过链路层交换机,并被根据MAC地址和VLAN 标签进行分类,从而确定数据包对应的目标VF。然后数据包被直接传输到该VF 对应虚拟机的接收缓冲区等待处理,这一步骤通过DMA 技术实现。在DMA 的过程中,IOMMU 承担了把虚拟机缓冲区内存地址翻译成机器物理地址的任务。在数据包传输完成之后,VF 会产生一个中断通知虚拟机有新数据包需要处理。每个由VF 产生的中断并不能直接送到虚拟机,而是被虚拟机监视器捕获,然后由虚拟机监视器在合适的时候给虚拟机注入一个虚拟中断通知数据包的到达。虚拟机收到中断之后,VF 驱动开始工作,处理接收缓冲区中的数据包。一条中断可能会被用来通知多个数据包的到达。
3、SR-IOV技术运行原理
当SR-IOV 网卡收到新数据包时,会向虚拟机监视器发起一个中断信号(在虚拟化环境下,硬件设备需要和CPU或者内存通信,都需要发送中断信号,其运作模式和传统的操作系统并无区别),虚拟监视器收到网卡发送过来的信号之后,截取该中断信号。然后虚拟机监视器将该中断信号进过一定的处理,给对应的虚拟机发送一个虚拟的中断信号,虚拟机在收到虚拟机监视器给他的中断信号后,虚拟机操作系统调用VF 驱动中的中断处理程序,中断处理程序通过发起NAPI 轮询来处理到达数据包。NAPI(New API)是Linux 内核提供的网络驱动接口,用于配合网卡的中断聚集技术使用。,中断聚集技术就是使用一个中断来通知处理所有的数据包,不再一个数据包一个中断,这个技术的好处就是节省了CPU等系统的资源,不让其老是处于中断状态浪费系统的资源。NAPI 技术合并了两种接收数据包的方法:中断和轮询。
在SR-IOV中,VF采用了NAPI 接口的网络驱动,其工作模式是这样的:首先驱动处于中断模式;当中断到来的时候,驱动转换为轮询模式并且中断被屏蔽;在轮询模式,驱动开始处理数据包直到所有数据包都已经被接收;然后驱动再次转换为中断模式,解除对中断的屏蔽。
4、使用SR-IOV技术所需条件
SR-IOV的性能在目前的I/O虚拟化环境下是最好的,但是需要一系列的支持,包括网卡、服务器、VMM、CPU等。
网卡:现目前来说,市面上就2家公司的网卡支持SR-IOV的技术,即Intel和EMULEX Corporation。Intel支持SR-IOV技术的网卡可以访问以下网址进行查询:http://www.winyao.com/news_info.asp?id=232
服务器:必须支持输入/输出内存管理单元 (IOMMU),并且必须在 BIOS 中启用 IOMMU。必须支持SR-IOV,并且必须在 BIOS 中启用 SR-IOV。这需要查询服务器的手册或着咨询服务器厂家。
VMM:即hypervisor的支持,现在的主流hypervisor都支持SR-IOV技术,比如XenServer、vSphere、KVM、Hyper-v等。其实就是SR-IOV的PF驱动有没有基于该hypervisor做开发和集成。
CPU:配备 AMD 处理器的主机不受SR-IOV 支持,必须配备 Intel 处理器。
虚拟机操作系统:其实操作系统应该也必须算上,因为部分操作系统SR-IOV的VF驱动就没有,你前面的条件满足了这一条不满足也使不了,现在主流使用的操作系统都是OK的。一些低版本的操作系统可能使用就有问题了。
5、在XenServer中使用SR-IOV技术
我们在前面的文章中提到过XenServer的两种网络堆栈模式,也给大家简单介绍了这两种模式的架构和工作原理。但是呢这两种都是基于纯软件虚拟的I/O虚拟化,在大规模和高并发的情况下,是无法满足虚拟机的性能需求的。比如你在XenServe上面部署Exchange邮件系统进行大规模并发压力测试的时候,你就会发现,你的网络IO是一个瓶颈。
所以基于这样的需求,我们可以在XenServer上面使用基于硬件的IO虚拟化SR-IOV技术,提高我们Exchange虚拟机系统的网络IO的性能。
只有 XenServer 硬件兼容性列表上所列的支持 SR-IOV 的 NIC 才支持SR-IOV 技术,而且该技术仅适用于Windows Server 2008 来宾操作系统【有朋友说在red hat上也测试通过】。
1. 在 XenServer 主机上打开本地命令 shell。
2. 运行 lspci 命令以显示虚拟功能 (VF) 的列表。例如:
07:10.0 Ethernetcontroller: Intel Corporation 82559 \
EthernetController Virtual Function (rev 01)
在上例中,07:10.0 是 VF 的 bus:device.function 地址。
3. 通过运行以下命令为目标 VM 分配所需的 VF:
xe vm-param-setother-config:pci=0/0000:<bus:device.function> uuid=<vm-uuid>
4. 启动 VM,然后为特定的硬件安装相应的 VF 驱动程序。