一、SR-IOV介绍shell
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 技术的优点之一。并发
二、SR-IOV体系结构ide
如图,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 设备初始化和使用。ui
如图,SR-IOV 以太网控制器包括了一个内置的链路层交换机,一个PF 和多个VF。
链路层交换机进入网卡的数据包首先通过链路层交换机,并被根据MAC地址和VLAN 标签进行分类,从而肯定数据包对应的目标VF。而后数据包被直接传输到该VF 对应虚拟机的接收缓冲区等待处理,这一步骤经过DMA 技术实现。在DMA 的过程当中,IOMMU 承担了把虚拟机缓冲区内存地址翻译成机器物理地址的任务。在数据包传输完成以后,VF 会产生一个中断通知虚拟机有新数据包须要处理。每一个由VF 产生的中断并不能直接送到虚拟机,而是被虚拟机监视器捕获,而后由虚拟机监视器在合适的时候给虚拟机注入一个虚拟中断通知数据包的到达。虚拟机收到中断以后,VF 驱动开始工做,处理接收缓冲区中的数据包。一条中断可能会被用来通知多个数据包的到达。
三、SR-IOV技术运行原理
当SR-IOV 网卡收到新数据包时,会向虚拟机监视器发起一个中断信号(在虚拟化环境下,硬件设备须要和CPU或者内存通讯,都须要发送中断信号,其运做模式和传统的操做系统并没有区别),虚拟监视器收到网卡发送过来的信号以后,截取该中断信号。而后虚拟机监视器将该中断信号进过必定的处理,给对应的虚拟机发送一个虚拟的中断信号,虚拟机在收到虚拟机监视器给他的中断信号后,虚拟机操做系统调用VF 驱动中的中断处理程序,中断处理程序经过发起NAPI 轮询来处理到达数据包。NAPI(New API)是Linux 内核提供的网络驱动接口,用于配合网卡的中断汇集技术使用。,中断汇集技术就是使用一个中断来通知处理全部的数据包,再也不一个数据包一个中断,这个技术的好处就是节省了CPU等系统的资源,不让其总是处于中断状态浪费系统的资源。NAPI 技术合并了两种接收数据包的方法:中断和轮询。
在SR-IOV中,VF采用了NAPI 接口的网络驱动,其工做模式是这样的:首先驱动处于中断模式;当中断到来的时候,驱动转换为轮询模式而且中断被屏蔽;在轮询模式,驱动开始处理数据包直到全部数据包都已经被接收;而后驱动再次转换为中断模式,解除对中断的屏蔽。
四、使用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的。一些低版本的操做系统可能使用就有问题了。
五、在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 驱动程序。