1.介绍
在Guest和Host间添加虚拟化层会引入很大的开销;计算工业界中一直在努力来解决这种开销。
为此,英特尔推出了一系列在英特尔虚拟化技术(intel@ VT )支持下的处理器、芯片组和以太网控制器增强功能。intel@ VT 系列技术可提高虚拟化平台的性能、效率和健壮性。
在此之上 PCI-SIG 制定了一种单根I/O虚拟化规范(SR-IOV) ,SR-IOV 的做法是在 I/O 子系统中开发一种扩展机制,以解决 I/O 设备的共享问题。
2.背景
2.1 I/O 虚拟化的目标
I/O 虚拟化方案需要为虚机提供与在单独的物理计算机上运行时相同的隔离环境。解决方案需要提供可扩展性,以支持利用空闲资源所需的虚拟机( VMs )数量。还应为 I/O 操作提供近乎宿主机的性能。隔离应提供存储空间的隔离, 还包括需要为 I/O 分流、中断分流,以及在共享设备的情况下隔离控制操作、I/O操作和异常处理的能力。
2.2 模拟 I/O
全虚拟化:
虚拟机并不知道运行在虚拟化环境中,I/O操作由hypervisor捕获,然后模拟;hypervisor捕获vm的I/O操作,然后模拟I/O操作
- 优点是可以模拟出各种各样的硬件设备;
- 缺点是每次 I/O 操作的路径比较长,需要多次上下文切换和VMExit,性能较差。
半虚拟化:
虚拟机知道自己运行在虚拟化环境内,并配合hypervisor完成I/O操作
目前 KVM 采用的的是 virtio 设备驱动框架,它提供了一种 Host 与 Guest 交互的 IO 框架。
KVM/QEMU 中 virtio 的实现采用在 Guest 内核中安装前端驱动 (Front-end driver)和在 QEMU 中实现后端驱动(Back-end)的方式。前后端驱动通过 vring 直接通信,绕过了经过 KVM 内核模块的过程,达到提高 I/O 性能的目的。
纯软件模拟的设备和 virtio 设备的区别:virtio 省去了纯模拟模式下的异常捕获环节,Guest OS 可以和 QEMU 的 I/O 模块直接通信。
virtio-ring实现了环形缓冲区(ring buffer),用于保存前端驱动和后端处理程序执行的信息,并且它可以一次性保存前端驱动的多次I/O请求,并且交由后端去动去批量处理,最后实际调用宿主机中设备驱动实现物理上的I/O操作,这样做就可以根据约定实现批量处理而不是客户机中每次I/O请求都需要处理一次,从而提高客户机与hypervisor信息交换的效率。
- 缺点:需要客户机中virtio相关驱动的支持(较老的系统默认没有自带这些驱动,Windows系统中需要额外安装virtio驱动),故兼容性较差,而且I/O频繁时的CPU使用率较高
2.3 设备直接分配
2.3.1 pci passthrough
随着硬件虚拟化技术的发展,Intel 和 AMD 都在处理器架构中提供对设备透传的支持(Intel 称为Virtualization Technology for Directed I/O (VT-d), AMD 称之为 I/O Memory Management Unit (IOMMU))
VT-d: 提供将 PCI 物理地址映射到客户虚拟系统的方法
- DMA remapping: 支持针对虚拟机DMA访问的地址转换。
虚拟机的操作系统(Guest OS)所提供的物理地址称为Guest Physical Address (GPA) ,它不一定与实际的物理地 址一致,也就是Host Physical Address (HPA),而DMA技术则要求访问真实的物理地址。DMA Remapping技术可以把Guest OS提供的GPA转化成HPA,然后数据就可以直接发送到Guest OS的缓冲区了。
- Interrupt remapping:支持虚拟机对设备中断的路由和隔离。
I/O设备会产生非常多的中断请求,I/O虚拟化必须正确地分离这些请求,并路由到不同的虚拟机上。传统设备的中断请求可以具有两种方式:一种将通过I/O中断控制器路由,一种是通过DMA写请求直接发送MSI(message signaled interrupts,消息中断),由于需要在DMA请求内嵌入目标内存地址,因此这个架构须要完全访问所有的内存地址,并不能实现中断隔离。 VT-d实现的中断重映射(interrupt-remapping)架构通过重新定义MSI的格式来解决这个问题,新的MSI仍然是一个DMA写请求的形式,不过并不嵌入目标内存地址,取而代之的是一个消息ID,通过维护一个表结构,硬件可以通过不同的消息ID辨认不同的虚拟机区域。VT-d实现的中断重映射可以支持所有的I/O源,包括IOAPICs,以及所有的中断类型,如通常的MSI以及扩展的MSI-X。
- MSI:另一种重要的技术是中断虚拟化MSI, MSI 将中断转换为更容易虚拟化的消息(缩放为数千个独立中断),而不是依赖将被关联到的一个物理中断引脚( pin)。MSI 是理想的 I/O 虚拟化技术,因为它支持多个中断源的隔离(而不是必须通过软件多路传输或路由的物理 pin)。
MSI的全称是Message Signaled Interrupt.MSI出现在PCI 2.2和PCIe的规范中,是一种内部中断信号机制。传统的中断都有专门的中断pin,当中断信号产生时,中断PIN电平产生变化(一般是拉低)
然而PCIe并没有多根独立的中断PIN,它使用特殊的信号来模拟中断PIN的置位和复位。MSI允许设备向一段指定的MMIO地址空间写一小段数据,然后ChipSet以此产生相应的中断给CPU. 这个特点带来的最主要的好处就是脱离了传统的interrupt pin的约束,中断的数目也不再受到限制。
2.3.2 VFIO
VFIO是一个可以安全的把设备I/O、中断、DMA等暴露到用户空间(userspace),从而可以在用户空间完成设备驱动的框架。用户空间直接设备访问,虚拟机设备分配可以获得更高的IO性能。
它提供两种基本服务:
- 向用户态提供访问硬件设备的接口
- 向用户态提供配置IOMMU的接口
在虚拟化情景下,亦可用来在用户态实现device passthrough.
由于device本身的特性、互连(interconnect)及IOMMU的拓扑等,IOMMU提供device 隔离(ioslation)的最小粒度是group,而不是device。如一个pci device可能包括多个function,而这些function之间数据传递可以通过专用通道(backdoor),而不经过IOMMU等等,所以device并不适合做隔离的最小单元。
VFIO据此做出container的概念,可容纳多个IOMMU group。打开/dev/vfio文件即新建一个空的container。在VFIO中,container是IOMMU操作的最小对象。
要使用VFIO,需先将设备与原驱动拨离,并与VFIO绑定。
用VFIO访问硬件的步骤:
- 打开设备所在IOMMU group在/dev/vfio/目录下的文件
- 使用VFIO_GROUP_GET_DEVICE_FD得到表示设备的文件描述 (参数为设备名称,一个典型的PCI设备名形如0000:03.00.01)
- 对设备进行read/write/mmap等操作
得益于vfio低开销的用户空间直接设备访问,虚拟机设备分配(device assignment)、高性能应用等可以获得更高的I/O性能。
3. SR-IOV
SR-IOV(PCI-SIG Single Root I/O Virtualization and Sharing)是PCI-SIG组织发布的规范。
SR-IOV 设计目标:通过为虚拟机提供独立的I/O地址空间、中断和DMA流而避免VMM的介入;允许设备支持多个虚拟功能,并且最小化每个附加功能的硬件成本。
SR-IOV引入了两个PCIe的function types
- Physical Functions(PFs):包括管理SR-IOV功能在内的所有PCIe function。
- Virtual Functions(VFs):一部分轻量级的PCIe function,只能进行必要的数据操作和配置。
SR-IOV机制提供独立多个可配置的VF,每一个VF具有独立的PCIe配置空间。VF 是“轻量级”PCIe功能,包含数据传输所需的资源,提供了一种数据输入和输出的机制。
虚拟机中的VF驱动程序应该是半虚拟化驱动程序(知道它在虚拟化环境中),并且只执行它可用的操作。
VF驱动程序是一个专门的驱动程序,它只有某些可用的功能,例如能够在VF中配置DMA描述符、配置MAC地址、VLAN标签等。
通常,VF提供发送和接收数据的能力, 以及执行复位的功能,复位仅影响VF本身,而不影响整个物理设备。对于超出VF复位或发送和接收数据的动作,VF驱动程序需要与主驱动程序通信。
3.1 SR-IOV相关的虚拟化技术
提供一种机制允许单个PCI Express设备支持8个以上的功能
虚拟机DMA访问的地址转换;Intel 提供VT-d来实现这一功能
PCIe规范允许 peer-to-peer transactions;意味着某些情况下数据交换可能不经过根复合体(root complex);
在虚拟化环境下一般不希望有 peer-to-peer transactions 而不经过root complex;
ACS提供一种机制,使得peer-to-peer transactions必须通过 root complex;
如果没有ACS,PCIe一端可能意外或有意(恶意)写入对等端点上的无效/非法区域,从而可能导致问题。
3.2 数据流向:
第一、二步:包到达,被送往L2 进行分类和交换
第三步: 根据目的MAC地址进行分类,这时候,改包与 缓冲池1匹配
第四步: 网卡发起DMA操作,将一个包传递给一个VM
第五步: DMA操作到达Intel 芯片集,在这里VT-d(由Hypervisor 配置)进行DMA操作所需的地址翻译;结果使得该包被直接送入到虚拟机的VF驱动缓冲里面
第六步: 网卡发起了MSI-X中断,表明该接收操作已经完成。该中断由Hypervisor接收。
第七步: Hypervisor向虚拟机注入一个虚拟中断表明传输已经结束,这时候虚拟机的VF驱动就开始处理该包。
3.3 开启SR-IOV
BIOS中开启VT-d, SR-IOV功能
在grub中加上 iommu=pt intel_iommu=on
配置网卡驱动/etc/modprobe.d/ixgbe.conf: options ixgbe max_vfs=63(千兆网卡支持8个vf,万兆网卡支持63个vf)
然后重启宿主机,lspci和ip -l可以看到;
然后需要把vfs从ixgbevf驱动上解绑,绑定到pci-stub或者vfio-pci驱动上,用于device passthough;
3.4 SR-IOV的优缺点:
优点:
1.降低了IO延迟和对CPU的占用,获得了接近原生的IO性能,因为虚拟机直接使用VFs,没有了VMM的陷入处理。
2.数据更加安全,因为每个VF属于一个IOMMU Group,共享IOMMU Group的设备不能分配给不同的虚拟机,而每个IOMMU Group又有独立的内存。
3.相比Device assignment, 没有了一个PCI设备只能给一个虚拟机的尴尬,SR-IOV下多个虚拟机可通过独占VFs的方式共享一个PCI设备。
缺点:
1.使用了VFs的虚拟机不能在热迁移。
4. 热迁移问题:
目前SR-IOV使用是通过pci passthrough 将vf(virtual function)分配给虚机,由于pci设备的状态信息等(如设备寄存器)保存在硬件中,hypervisor失去了对虚拟硬件的控制,难以同步不同 Host 上的硬件状态
解决方案:
1. sriov + macvtap: 使用macvtap的passthru模式,将vf直接passthru到macvtap设备,然后vm使用tap设备与外界通信;这种方式使用qemu模拟网卡,避开了保存硬件信息的问题,但是比起vf passthough的方式带来了一定的性能损耗
2. sriov + ovs:将vf passthough到vm的同时给vm分配一个ovs网卡,在vm内部做bonding,使用active-backup模式,正常使用时vf网卡up,并且作为primary;迁移时vf网卡down,使用ovs网卡
4.1 sriov + macvtap:
MACVLAN是一种网络虚拟化技术。Linux使用非常轻量的方式实现MACVLAN,因为MACVLAN不使用传统的Linux bridge做隔离和区分,而是直接与Linux的以太网接口或者子接口关联,以实现在物理网络中网络和连接的隔离。MACVLAN 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡。
MACVTAP 是对 MACVLAN的改进,把 MACVLAN 与 TAP 设备的特点综合一下,使用 MACVLAN 的方式收发数据包,但是收到的包不交给 network stack 处理,而是生成一个 /dev/tapX 文件,交给这个文件。
Passthrough 模式下,内核的 MACVLAN 数据处理逻辑被跳过,硬件决定数据如何处理,从而释放了 Host CPU 资源。
MACVTAP Passthrough 针对 MACVTAP 网络设备,目的是饶过内核里 MACVTAP 的部分软件处理过程,转而交给硬件处理。在虚拟化条件下,数据还是会先到达模拟器 I/O 层,再转发到硬件上,这样做效率有损失,但模拟器仍然控制虚拟硬件的状态及数据的走向,可以做热迁移。
4.2 SR-IOV + OVS:
vf 网卡和ovs网卡做bonding(mode 1)
迁移前vf网卡active;要迁移时将ovs网卡up,并置于active状态,将vf网卡down;迁移后恢复vf网卡active,ovs网卡down
https://www.cnblogs.com/sammyliu/p/4543657.html
https://www.ibm.com/developerworks/cn/linux/l-virtio/index.html
https://www.linux-kvm.org/images/b/b4/2012-forum-VFIO.pdf
https://huangwei.me/wiki/tech_cloud_macvlan_macvtap.html
《pci-sig-sr-iov-primer-paper》