• 虚拟化概述


    虚拟化概述

    本文重点介绍了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,硬件编解码)的内部数据处理流程一致。

     

    人工智能芯片与自动驾驶
  • 相关阅读:
    angular-ui-bootstrap插件API
    简易富文本编辑器bootstrap-wysiwyg源码注释
    deployd使用归纳
    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助
    COCOS2D-JS入门-官网template源码解析
    COCOS2D-JS入门-web端项目部署
    jQuery 插件格式
    react native 使用 native-echarts 在安卓上无法显示解决办法
    springboot项目启动报错Failed to configure a DataSource: 'url' attribute is not specified and no embedde
    Mac 上 Class JavaLaunchHelper is implemented in both 报错
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/14817481.html
Copyright © 2020-2023  润新知