虚拟化概述

虚拟化概述

本文重点介绍了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到虚拟机的步骤如下:

  1. 安装MLU驱动。

在Host主机上安装MLU驱动,SR-IOV会同MLU驱动一起安装。安装完成后,重启机器使Host新驱动生效。

  1. 拆分MLU270到VF。

以拆分到4个VF为例,步骤如下:

  1. 通过lspci命令获取MLU270卡的BDF(bus,device,function)。
b.   lspci -d:0270

假设获取到的某张MLU270卡的BDF为“xx:yy.0”。

  1. 执行以下命令将MLU270卡拆分到4个VF。
d.   sudo sh -c "echo 4 > /sys/bus/pci/devices/"xx:yy.0"/sriov_numvfs"

该命令将MLU270拆分到4个VF,Device ID为0271。

  1. 执行以下命令查看拆分的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
  1. 将VF Pass through到QEMU-KVM虚拟机。

使用以下命令将某一个VF Pass through到虚拟机,其中“xx:yy.z”为VF的BDF。

virsh nodedev-detach pci_0000_xx_yy_z
  1. 启动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
  1. 在QEMU虚拟机里面安装MLU的驱动安装包,并重启虚拟机以保证新安装的驱动生效。

热迁移

热迁移(Live Migration),又叫动态迁移,通常是先将整个虚拟机的运行状态完整保存下来,然后恢复到原有硬件平台或其他硬件平台。迁移成功后,虚拟机仍旧平滑运行,用户不会察觉到任何差异。

要使用热迁移功能,必须有2张MLU270的卡,并且两张卡的拆分方式必须相同。目前只支持相同的VF之间的迁移。例如,如果源虚拟机的vf为1b:00.1,目的虚拟机的vf为1c:00.1,那么可以成功迁移;如果目的虚拟机的vf为1c:00.2,则无法正常迁移。

目前在MLU270上可以使用QEMU命令方式进行热迁移。

迁移前目的端虚机一定要加载驱动。

基于QEMU命令迁移

  1. 将热迁移patch打到QEMU。

本文使用QEMU 3.10。可以从开源社区下载QEMU源码,并打上vMLU设备热迁移的patch(咨询相关人员获取该patch)。

打完patch后,检查QEMU根目录qemu是否有hw/cambricon目录。如果有,说明打patch成功。

cd qemu-3.10
patch –p 1 < ./qemu.patch
  1. 重新编译QEMU。

编译完成后,将使用重新编译的QEMU代替系统自带的QEMU组件进行后续操作。

mkdir build
cd build
../configure
make
  1. 分别在源端服务器和目的端服务器上加载卡Host PF驱动。

进入驱动的源码包,执行如下脚本。

sudo ./load_with_sriov
  1. 迁移主机使能SR-IOV。

QEMU可以在同一台服务器上进行迁移,也可以在两台不同的服务器间进行迁移。迁移前需要源端和目的端全部使能卡的SR-IOV。xxxx:xx:xx:x为PCIe设备的BDF号。

echo x > /sys/bus/pci/devices/0000:xxxx:xx:xx:x/sriov_numvfs
  1. 通过shell命令将pass through给虚拟机的vf与host解绑,然后与VFIO驱动绑定。

以PCIe设备0000:03:01.1为例的脚本如下:

virsh nodedev-detach pci_0000:03:01.1
  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 &
  1. 使用重新编译后的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 &
  1. 在源虚拟机中加载驱动。

使用VNC或者其它方式连接源端虚拟机,进入驱动源码包目录,执行以下命令加载驱动:

./load
  1. 开始热迁移。

有以下两种方法:

  • 在源端QEMU界面按下Ctrl + Alt + 2,然后输入 migrate tcp:xx.xx.xx.xx:端口号 。其中IP地址为目的端虚拟机的IP地址,端口号为之前设置的目的端虚拟机输入端口号6667。
  • 在运行qemu的命令行里面添加 -monitor tcp:xx.xx.xx.xx:monitor_port_num,server,nowait 参数,使用 echo "migrate -d tcp:192.168.1.2:6667" | nc -n xx.xx.xx.xx monitor_port_num 命令触发虚拟机进行热迁移。
·       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,硬件编解码)的内部数据处理流程一致。

 

posted @ 2021-05-27 13:25  吴建明wujianming  阅读(1345)  评论(0编辑  收藏  举报