IO设备虚拟化技术背景介绍
随着云计算技术的发展,IO设备虚拟化经历了从全虚拟化(full-virtualization)到半虚拟化(para-virtualization),到设备直通的变革。Intel® Virtualization Technology for Directed I/O(Intel VT-d)是英特尔发布的IO虚拟化技术。通过Intel VT-d,可以把物理设备直通(pass-through)给虚拟机,使虚拟机直接访问物理设备,其性能近似无虚拟机环境下的IO性能。
SR-IOV(Single Root I/O Virtualization and Sharing)是PCI标准组织制定的在PCI设备级对虚拟化进行的支持。基于PCI SR-IOV技术,同一个PCIe设备可以实现逻辑上隔离的多个轻量级 “PF(physical function)”——VF(virtual function) 。同一个PF创建的多个VF可以独立隔离地分配给不同的虚拟机或者容器,极大地提高了性能和资源使用效率。高性能IO设备如网卡、存储、GPU等都支持SR-IOV。
随着容器的广泛使用,实例的密度增加,使用VF存在以下限制:
1)可扩展性差:由于VF是通过BDF号进行隔离的,所以每个VF都需要各自的配置空间,由此产生的额外开销较大;且硬件资源上的VF数量有限,比如英特尔E810的网卡可以创建的最大VF数量为256个。
2)灵活性不好:VF资源需要在使用前一次性创建和销毁所有的实例。
3)设备快照不容易创建:因为设备是直通给虚拟机的,hypervisor对于设备状态是无感知的,因此难以记录设备状态。
本文介绍的Intel® Scalable I/O Virtualization (Intel Scalable IOV)是另一种硬件辅助的I/O设备直通技术。本文将分别从硬件功能、软件实现的角度介绍Intel Scalable IOV,并以Intel E810网卡为例给出Intel Scalable IOV实现设备直通的两个案例。
Intel® Scalable I/ O Virtualization技术简介
Intel® Scalable I/O Virtualization(Intel Scalable IOV)是针对下一代 CPU 服务器平台的虚拟化解决方案,是一种硬件辅助的I/O设备直通技术。它采用了现有的 PCI Express 功能结构,实现了高性能和更灵活的I/O设备共享的架构。
系统平台支持
系统平台方面,Intel VT-d 3.0添加了对Intel Scalable IOV的支持。IOMMU提供DMA重映射技术,把不同设备提供的IOVA地址转换成物理地址,用于设备DMA。
Intel IOMMU实现基于PASID粒度的地址转换。平台IOMMU支持基于每个设备DMA的PASID查找不同的页表,保证ADI之间的隔离。
硬件设备功能
Intel Scalable IOV基于PASID(Process Address Space ID)实现设备隔离。使用PASID可以实现比VF更细粒度的隔离和更轻量的资源分配。硬件PCIe设备需要使能PASID TLP前缀,在其PCIe数据包的TLP Prefix部分添加PASID值。通过PASID值以及requester ID(即BDF号),可以确定数据包所属的进程地址空间ID。
Intel Scalable IOV支持的最小硬件资源为ADI(Assignable Device Interface)。ADI可以由不同的设备资源组成,比如有固定数量RX/TX队列的虚拟网卡。
在对设备进行初始化和枚举时需要知道设备是否支持Scalable IOV。Intel定义了DVSEC域用于发现和配置支持Scalable IOV技术的设备。
优势和适用场景
Intel Scalable IOV的资源更轻量,因此同一个设备上可以支持更多的虚拟设备。如Intel E810网卡,可以支持的VF数量为256个,而基于PASID可以支持700+个ADI。Intel Scalable IOV支持虚拟设备按需、动态创建。因为Intel Scalable IOV占用的资源少,因此启动时间更短,也更易于热迁移。Intel Scalable IOV更适用于大规模容器群。
Intel® Scalable I/O Virtualization深度刨析
整体架构
对于Intel Scalable IOV软件支持的框架如图1所示(注1)。
图1. Intel Scalable IOV整体架构
VDCM(Virtual Device Composition Module)负责设备的管理和慢速路径的处理。
虚拟机和容器有两条路径访问硬件设备:intercepted path和direct path。其中,intercepted path路径负责配置资源、管理设备,通过VDCM软件模拟实现。VDCM使用设备驱动提供的接口配置设备;direct path通过映射底层的硬件设备,提升硬件设备访问性能。这种架构的好处在于:一方面,设备模型更简单灵活;另一方面,由hypervisor负责创建管理设备,解决了SR-IOV中hypervisor无法记录和感知设备状态的问题。
VDEV(virtual device)作为共享物理设备和虚拟机的接口,分配给虚拟机或者容器。VDEV包含虚拟的requester ID(即BDF号)、CSR和BARs,以及虚拟的MSI-X表。使用VDEV时不需要提前创建好将来要用的所有实例,在需要使用的时候创建就可以。
设备部分软件实现
本文介绍的软件实现依赖于linux kernel的VFIO-MDEV(Mediated Device)框架[4],在linux 5.2-rc1版本引入。VDCM(Virtual Device Composition Module)模块负责:1)分配、配置、重置和释放ADI,2)配置PASID。
下面介绍一下如何把VDEV和PASID绑定以及用户态程序访问ADI资源的两种方式。
VDEV和PASID绑定
如前文所述,Intel Scalable IOV基于PASID实现设备隔离。这一节介绍如何把VDEV和PASID绑定。
如图2所示,VDEV绑定PASID的流程如下:
VDCM通过mdev_set_iommu_device()接口把VDEV注册到MDEV bus。
VFIO把MDEV绑定到一个IOMMU domain。
IOMMU分配一个PASID并建立IOMMU页表——所有标记了该PASID的DMA请求都将使用这个IOMMU domain翻译。
设备驱动通过VFIO的mdev_get_iommu_domain() 接口和IOMMU的iommu_aux_get_pasid()接口获得VDEV所在的IOMMU domain和VDEV绑定的PASID.
把PASID值写入设备设备寄存器。
图2. 配置PASID流程
ADI资源访问
如图3所示,用户态程序(以AVF驱动为例)有两种方式访问ADI资源。一种是通过VFIO和VDCM:即图中的slow path:VDCM通过软件模拟ADI寄存器,经由设备驱动访问和配置设备;另一种是使用内存映射,即图中的fast path:把VDEV映射到user space,建立MMU或者EPT页表,实现HVA(Host Virtual Address)或者GPA(Guest Physical Address)到HPA(Host Physical Address)的转换。
图3. 访问ADI资源的两种方式
Intel® Scalable I/O Virtualization直通案例
在VM中使用Intel E810 ADI 设备
本节介绍在虚拟机环境中使用基于Intel E810的Intel Scalable IOV。系统架构如图4场景1所示。使用步骤如下:
1. 加载MDEV内核模块。
# modprobe mdev
2. 创建MDEV。E810网卡的BDF是0000:16:00.0。这个时候内核驱动中的VDCM模块分配ADI资源,为ADI申请PASID并绑定到IOMMU domain。
# echo "596661ba-b9f9-11ec-97ad-984fee0051ab" > \
/sys/class/mdev_bus/0000\:16\:00.0/mdev_supported_types/ice-vdcm/create
3.启动QEMU,通过参数把VDEV传给虚拟机。
-device vfio-pci, \
sysfsdev=/sys/bus/mdev/devices/596661ba-b9f9-11ec-97ad-984fee0051ab/
4.在VM中加载AVF驱动。
# insmod iavf.ko
对于没有映射到虚拟机的寄存器,AVF驱动在访问时会产生缺页异常类型的VM-Exit,被KVM捕获后,QEMU模拟该寄存器的读写,调用VFIO和VDCM;对于映射到虚拟机的寄存器,访问不会被QEMU模拟。QEMU在启动的时候把VDEV的BAR映射到QEMU的进程地址空间。KVM建立EPT页表后,虚拟机在访问VDEV的寄存器时不会产生缺页异常。
图4. Intel Scalable IOV的两种使用场景
Intel E810的网卡中现已添加了对Intel Scalable IOV的支持,相关代码在设备驱动 OOT版本中发布。
在DPDK中使用Intel E810 ADI设备
本节介绍在DPDK中使用基于Intel E810的Intel Scalable IOV。系统架构如图3场景2所示,在DPDK的PCI总线中支持了MDEV设备。PCI总线在probe的时候加载MDEV。使用步骤如下:
1.加载MDEV内核模块。
# modprobe mdev
2.创建MDEV——步骤1和2跟上一个案例在VM里使用Intel E810 ADI是一样的。
# echo "596661ba-b9f9-11ec-97ad-984fee0051ab" > \
/sys/class/mdev_bus/0000\:16\:00.0/mdev_supported_types/ice-vdcm/create
3.启动testpmd。PCI总线驱动在probe发现MDEV,根据MDEV的sysfs路径查找MDEV设备并把VDEV的硬件寄存器地址映射到DPDK的虚拟地址空间。
# ./dpdk-testpmd -c 0xf -n 4 -m 512 -- -I –rxq=1 –rxq=1
4.DPDK中AVF驱动访问虚拟寄存器地址时通过VFIO直接访问到VDEV的硬件寄存器。
DPDK中英特尔E810网卡驱动也已支持Intel Scalable IOV,该功能可以在customer release中使用。
总结
本文介绍了Intel Scalable IOV技术的基本原理和整体框架。Intel Scalable IOV基于PASID实现硬件设备隔离,使用ADI作为资源分配的单位,通过VDCM实现软件模拟和配置管理硬件。对比SR-IOV,Intel Scalable IOV更轻量、配置管理更灵活。最后文章以 QEMU和DPDK为例,阐述了Intel E810网卡在内核空间和用户空间使用Intel Scalable IOV的两种场景。
原文链接: https://mp.weixin.qq.com/s/u76IZhPSFdVtGt1ar5DR5g
学习更多dpdk视频
DPDK 学习资料、教学视频和学习路线图 :https://space.bilibili.com/1600631218
Dpdk/网络协议栈/ vpp /OvS/DDos/NFV/虚拟化/高性能专家 上课地址: https://ke.qq.com/course/5066203?flowToken=1043799
DPDK开发学习资料、教学视频和学习路线图分享有需要的可以自行添加学习交流q 君羊909332607备注(XMG) 获取