SR-IOV
SR-IOV 全称 Single Root I/O Virtualization,是 Intel 在 2007 年提出的一种基于硬件的虚拟化解决方案。在虚拟化场景中,CPU 与内存是最先解决的,但是 I/O 设备一直没有很好的解决办法,Intel 有 VT-d(Virtualization Technology for Directed I/O)可以将物理服务器的 PCIe 设备直接提供给虚拟机使用,也就是我们常说的 Passthrough,但是直通面临一个问题是 PCIe 设备只能给一个虚拟机使用,其他虚拟机就只能干瞪眼,这肯定是不行的,所以有了 SR-IOV,一个物理设备可以虚拟出多个虚拟设备给虚拟机使用。
基本概念
SR-IOV(Single Root I/O Virtualization)是一个将 PCIe共享给虚拟机的标准,通过为虚拟机提供独立的内存空间、中断、DMA流,来绕过 VMM实现数据访问,此功能使得虚拟功能可以共享物理设备,并在没有 CPU 和虚拟机管理程序软件开销的情况下执行 I/O。SR-IOV 基于两种 PCIe functions:
PF(Physical Function): 包含完整的PCIe功能,包括SR-IOV的扩张能力,该功能用于SR-IOV的配置和管理- 禁用 SR-IOV 后,主机将在一个物理网卡上创建一个 PF
- 每个 PF 最多可有 64,000 个与其关联的 VF,VF 的具体数量限制受限于 PCIe 设备自身配置及驱动程序的支持
- PF 可以通过寄存器创建 VF,这些寄存器设计有专用于此目的的属性
VF(Virtual Function): 包含轻量级的PCIe功能。每一个VF有它自己独享的PCI配置区域,并且可能与其他VF共享着同一个物理资源- 每个 VF 都是通过 PF 来生成管理的,创建 VF 后,可以直接将其指定给虚拟机或各个应用程序
- 每个 VF 都具有一个 PCI 内存空间,用于映射其寄存器集。VF 设备驱动程序对寄存器集进行操作以启用其功能,并且显示为实际存在的 PCI 设备
- 一旦在 PF 中启用了 SR-IOV,就可以通过 PF 的总线、设备和功能编号(路由 ID)访问各个 VF 的 PCI 配置空间
前置要求
CPU必须支持IOMMU(比如英特尔的VT-d或者AMD的AMD-Vi,Power8处理器默认支持IOMMU)- 固件
Firmware必须支持IOMMU CPU根桥必须支持ACS或者ACS等价特性PCIe设备必须支持ACS或者ACS等价特性- 建议根桥和
PCIe设备中间的所有PCIe交换设备都支持 ACS,如果某个PCIe交换设备不支持ACS,其后的所有PCIe设备只能共享某个IOMMU组,所以只能分配给 1 台虚机。
使用示例
查看网卡是否支持 SR-IOV,可以看到 Capabilities 字段中支持 SR-IOV
|
|
创建 VF,其中 num_vfs 为需要创建的 VF 个数,可以查看 /sys/class/net/<eth>/device/sriov_totalvfs 查询支持的最大 VFs 个数
|
|
使用 lspci 可以查看创建的 Virtual Function,可以看到当前容器有两张 RDMA 网卡,使用其中一张 eth2 创建了 48 个 VF。
|
|
这个时候查看网口设备:
|
|
查看 eth2 各个 VF 对应的 PCI 号如下:
|
|
根据 PCI 号可以查找到 VF 对应的网络设备名,可知 0000:b3:00.2 对应的设备名是 dev506:
|
|
通过 libvirt 绑定到虚拟机
|
|
当然也可以给网卡配置 MAC地址和 VLAN:
|
|
通过 Qemu 绑定到虚拟机
/usr/bin/qemu-kvm -name vdisk -enable-kvm -m 512 -smp 2 \
-hda /mnt/nfs/vdisk.img \
-monitor stdio \
-vnc 0.0.0.0:0 \
-device pci-assign,host=0b:00.0
其中 SR-IOV 支持方式就如前面提到的概念一样,大概需要如下配置:
- 在 BIOS 中启用网卡的 SR-IOV 功能
- 在 ESXi 安装 MFT vib 工具,用于管理和配置网卡 FW
- 在网卡 FW 中开启 SR-IOV,设置最大的 VF 数量
- 在 ESXi 网卡驱动中,开启 SRIOV,设置 VF 数量,需要重启 ESXi
- 创建对应的 vSwitch 并将 PF 作为上联网卡接入
- 创建虚拟机,添加 VF 作为 SR-IOV 网络适配器,并选择 PF 所在的 vSwitch 即可
架构对比
SR-IOV vs PCI path-through
架构上的比较(以网卡为例)
Virtio 和 Pass-Through 的详细比较
图片来源slideshare - Kvm performance optimization for ubuntu、[KVM 介绍(4):I/O 设备直接分配和 SR-IOV KVM PCI/PCIe Pass-Through SR-IOV]
SR-IOV vs DPDK
特性总结
SR-IOV 优点
- 性能好
- 减少主机 CPU 消耗
Pros:
- More Scalable than Direct Assign
- Security through IOMMU and function isolation
- Control Plane separation through PF/VF notion
- High packet rate, Low CPU, Low latency thanks to Direct Pass through
SR-IOV 缺点
- 虚拟机使用 VF 后无法进行内存超分、快照、热迁移等高级功能
- 配置管理复杂
- Rigid: Composability issues
- Control plane is pass through, puts pressure on Hardware resources
- Parts of the PCIe config space are direct map from Hardware
- Limited scalability (16 bit)
- SR-IOV NIC forces switching features into the HW
- All the Switching Features in the Hardware or nothing
SR-IOV 相对与软件模拟 IO 虚拟化的优点:
1.降低了 IO 延迟和对 CPU 的占用,获得了接近原生的 IO 性能,因为虚拟机直接使用 VFs,没有了 VMM 的陷入处理。
2.数据更加安全,因为每个 VF 属于一个 IOMMU Group,共享 IOMMU Group 的设备不能分配给不同的虚拟机,而每个 IOMMU Group 又有独立的内存。
SR-IOV 相对与 Device assignment 的优点:
没有了一个 PCI 设备只能给一个虚拟机的尴尬,SR-IOV 下多个虚拟机可通过独占 VFs 的方式共享一个 PCI 设备。
SR-IOV 的缺点:
使用了 VFs 的虚拟机不能在线迁移。
参考资料
- https://en.wikipedia.org/wiki/Single-root_input/output_virtualization
- https://github.com/intel/sriov-cni
- https://github.com/hustcat/sriov-cni
- Redhat OpenStack SR-IOV Configure
- I/O 设备直接分配和 SRIOV
- Story of Network Virtualization and its future in Software and Hardware
- Introduction To Switchdev SR-IOV Offloads
- https://doc.dpdk.org/guides-18.05/prog_guide/switch_representation.html
- Single Root I/O Virtualization and Sharing Specification Revision 1.1
- http://km.oa.com/group/34513/articles/show/341030
- https://www.cnblogs.com/sammyliu/p/4548194.html
- https://www.snia.org/sites/default/files/RonEmerick_PCI_Express_IO_Virtualization.pdf
- https://blog.csdn.net/Memblaze_2011/article/details/88635993
- https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux_openstack_platform/7/html/networking_guide/sec-sr-iov
-
No backlinks found.