虚拟化概述
本文重点介绍了SR-IOV技术以及MLU270对SR-IOV的支持。
SR-IOV简介
SR-IOV(Single Root I/O Virtualization)技术是一种基于硬件的虚拟化解决方案,可提供高性能和可伸缩性的虚拟解决方案。SR-IOV制定了标准化机制来实现多个虚拟机共享一个I/O设备。使得在虚拟机之间高效共享PCIe(Peripheral Component Interconnect Express,快速外设组件互连)设备,可以获得与本机相似的I/O性能。了解SR-IOV规范,请查看 http://www.pcisig.com。
SR-IOV分为以下两种功能类型:
- PF(Physical Function,物理功能):根据SR-IOV规范中定义,PF具有PCI功能,用于支持SR-IOV功能。PF包含SR-IOV功能结构,用于管理SR-IOV功能。PF是全功能的PCIe功能,可以像其他任何PCIe设备一样进行发现、管理和处理。PF拥有完全配置资源,可以用于配置或控制PCIe设备。
- VF(Virtual Function,虚拟功能):与PF关联的一种功能。VF是一种轻量级PCIe功能,可以与PF以及与同PCIE设备的其他VF共享物理资源。VF仅拥有用于其自身行为的配置资源。
每个SR-IOV设备都可有一个PF,并且每个PF可有多个与其关联的VF。
每个VF都具有一个PCI内存空间,用于映射其寄存器集。VF设备驱动程序对寄存器集进行操作以启用其功能,并且显示为实际存在的PCI设备。创建VF后,可以直接将其指定给客户VM。使得VF可以共享同一物理设备,并在没有CPU和虚拟机管理程序软件开销的情况下,执行数据的输入输出。
虚拟化工作原理
MLU270支持SR-IOV,一张单卡资源可由最多4个虚拟机共享。每个VF拥有各自单独、隔离的物理资源,可以彼此互不影响地并行执行任务。
虚拟化工作原理
SR-IOV在MLU270 上的应用
本章重点介绍了SR-IOV在MLU270上的应用。
虚拟功能VF的介绍
VF主要实现满足上层业务需求的各项功能(业务功能)。PF接受VF的特权操作请求,替VF完成这些特权操作。VF各项资源可独立使用、重置,不影响其它VF。
当重新配置VF时,用户无需卸载驱动,即可动态配置VF。
虚拟功能VF的配置
根据配置,每个VF可设置为独占1、1/2、或1/4整卡资源。板卡资源包括推理处理单元(IPU)、视频处理单元(VPU)、JPEG处理单元(JPU)和内存等。
运行以下指令配置VF:
echo 占卡资源数 > /sys/bus/pci/devices/bdf/sriov_num
用户根据需要将上面指令中的“占卡资源数”变量替换为1、2、3或4。
- 当使能1个VF,此VF独占整个板卡资源,如下图所示。
- 占用全部板卡资源的VF
- 当使能2个VF,每个VF独占1/2板卡资源,如下图所示。
- 占用1/2板卡资源的VF
- 当使能3个VF,其中1个VF占用1/2板卡资源,另外两个VF各占用1/4板卡资源,如下图所示。
占用1/2和1/4板卡资源的VF组合
- 当使能四个VF,每个VF独占1/4板卡资源,如下图所示。
- 占用1/4板卡资源的VF
VF Pass through到虚拟机
虚拟机模式VF示意图如下所示:
将VF Pass through到虚拟机的步骤如下:
- 安装MLU驱动。
在Host主机上安装MLU驱动,SR-IOV会同MLU驱动一起安装。安装完成后,重启机器使Host新驱动生效。
- 拆分MLU270到VF。
以拆分到4个VF为例,步骤如下:
- 通过lspci命令获取MLU270卡的BDF(bus,device,function)。
b. lspci -d:0270
假设获取到的某张MLU270卡的BDF为“xx:yy.0”。
- 执行以下命令将MLU270卡拆分到4个VF。
d. sudo sh -c "echo 4 > /sys/bus/pci/devices/"xx:yy.0"/sriov_numvfs"
该命令将MLU270拆分到4个VF,Device ID为0271。
- 执行以下命令查看拆分的4个VF。
f. lspci -d:0271
显示如下信息:
xx:yy.1 Processing accelerators: Device cabc:0271
xx:yy.2 Processing accelerators: Device cabc:0271
xx:yy.3 Processing accelerators: Device cabc:0271
xx:yy.4 Processing accelerators: Device cabc:0271
- 将VF Pass through到QEMU-KVM虚拟机。
使用以下命令将某一个VF Pass through到虚拟机,其中“xx:yy.z”为VF的BDF。
virsh nodedev-detach pci_0000_xx_yy_z
- 启动QEMU虚拟机。
不同操作系统启动虚拟机的命令可能会不同。下面以CentOS 7系统为例来启动QEMU虚拟机:
qemu-system-x86_64 -cpu host -enable-kvm -m 16000M -smp 8 -name MLU_QEMU_1 -drive file=Centos7.qcow2,if=virtio,media=disk,cache=writeback,format=qcow2 -device vfio-pci,host=xx:yy.z,id=hostdev0,bus=pci.0,addr=0x9 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8
- 在QEMU虚拟机里面安装MLU的驱动安装包,并重启虚拟机以保证新安装的驱动生效。
热迁移
热迁移(Live Migration),又叫动态迁移,通常是先将整个虚拟机的运行状态完整保存下来,然后恢复到原有硬件平台或其他硬件平台。迁移成功后,虚拟机仍旧平滑运行,用户不会察觉到任何差异。
要使用热迁移功能,必须有2张MLU270的卡,并且两张卡的拆分方式必须相同。目前只支持相同的VF之间的迁移。例如,如果源虚拟机的vf为1b:00.1,目的虚拟机的vf为1c:00.1,那么可以成功迁移;如果目的虚拟机的vf为1c:00.2,则无法正常迁移。
目前在MLU270上可以使用QEMU命令方式进行热迁移。
迁移前目的端虚机一定要加载驱动。
基于QEMU命令迁移
- 将热迁移patch打到QEMU。
本文使用QEMU 3.10。可以从开源社区下载QEMU源码,并打上vMLU设备热迁移的patch(咨询相关人员获取该patch)。
打完patch后,检查QEMU根目录qemu是否有hw/cambricon目录。如果有,说明打patch成功。
cd qemu-3.10
patch –p 1 < ./qemu.patch
- 重新编译QEMU。
编译完成后,将使用重新编译的QEMU代替系统自带的QEMU组件进行后续操作。
mkdir build
cd build
../configure
make
- 分别在源端服务器和目的端服务器上加载卡Host PF驱动。
进入驱动的源码包,执行如下脚本。
sudo ./load_with_sriov
- 迁移主机使能SR-IOV。
QEMU可以在同一台服务器上进行迁移,也可以在两台不同的服务器间进行迁移。迁移前需要源端和目的端全部使能卡的SR-IOV。xxxx:xx:xx:x为PCIe设备的BDF号。
echo x > /sys/bus/pci/devices/0000:xxxx:xx:xx:x/sriov_numvfs
- 通过shell命令将pass through给虚拟机的vf与host解绑,然后与VFIO驱动绑定。
以PCIe设备0000:03:01.1为例的脚本如下:
virsh nodedev-detach pci_0000:03:01.1
- 使用重新编译后的QEMU启动源端虚拟机。
此过程需要用户提前安装虚拟机镜像,通过 -device
vfio-pci 指定透传的PCIe设备,参考参数如下:
sudo qemu-system-x86_64 -cpu host -enable-kvm -m 16000M -smp 16 -device vfio-pci,host=0000:03:01.1,id=hostdev0,bus=pci.0,addr=0x9 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 -vnc :9 &
- 使用重新编译后的QEMU启动目的端虚拟机。通过 -incoming 指定迁移使用的端口号。
本例中,目的虚拟机的输入端口号为6667。
sudo qemu-system-x86_64 -cpu host -enable-kvm -m 16000M -smp 16 -device vfio-pci,host=0000:03:01.1,id=hostdev0,bus=pci.0,addr=0x9 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 -incoming tcp:0:6667** -vnc :10 &
- 在源虚拟机中加载驱动。
使用VNC或者其它方式连接源端虚拟机,进入驱动源码包目录,执行以下命令加载驱动:
./load
- 开始热迁移。
有以下两种方法:
- 在源端QEMU界面按下Ctrl + Alt + 2,然后输入 migrate
- 在运行qemu的命令行里面添加 -monitor
· migrate tcp:192.168.1.2:6667
· #在源端虚拟机上执行以下命令
· sudo qemu-system-x86_64 -cpu host -enable-kvm -m 16000M -smp 16 -device vfio-pci,host=0000:03:01.1,id=hostdev0,bus=pci.0,addr=0x9 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 -monitor tcp:127.0.0.1:55551,server,nowait -vnc :9
· #在目的端虚拟机上执行以下命令
· sudo qemu-system-x86_64 -cpu host -enable-kvm -m 16000M -smp 16 -device vfio-pci,host=0000:03:01.1,id=hostdev0,bus=pci.0,addr=0x9 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 -incoming tcp:192.168.1.2:6667 -monitor tcp:127.0.0.1:55552,server,nowait -vnc :10
· #在源端虚拟机上执行以下命令
· echo "migrate -d tcp:192.168.1.2:6667" | nc -n 127.0.0.1:55551
10. 迁移完成后,使用VNC或者其它方式连接目的端虚拟机。
会发现目的端虚拟机上已完全恢复了源端内容。
编解码内部视频以及图像数据流
虚拟化技术使用VPU和JPU进行内部视频以及图像数据流的编码和解码,与CNCodec(Cambricon Neuware Codec,硬件编解码)的内部数据处理流程一致。