DOCA 文档 v2.10.0

SR-IOV 实时迁移

注意

此功能仅在以太网模式下受支持。

实时迁移是指将运行在一个物理主机上的客户虚拟机 (VM) 移动到另一个主机,而不会中断正常操作或对最终用户造成其他不利影响的过程。

使用迁移过程对于以下方面很有用

  • 负载均衡

  • 硬件独立性

  • 节能

  • 地理迁移

  • 容错

迁移的工作原理是将客户虚拟机的内存状态和任何虚拟化设备发送到目标主机物理机。迁移可以是实时的或非实时的,在实时情况下,迁移不会中断用户操作,并且对用户是透明的,如下节所述。

当使用非实时迁移过程时,Hypervisor 会暂停客户虚拟机,然后将客户虚拟机内存的映像移动到目标主机物理机。然后,客户虚拟机在目标主机物理机上恢复,并且客户虚拟机在源主机物理机上使用的内存将被释放。完成此类迁移所需的时间取决于网络带宽和延迟。如果网络正经历大量使用或低带宽,则迁移将花费比预期更长的时间。

当使用实时迁移过程时,客户虚拟机在源主机物理机上继续运行,同时其内存页被传输到目标主机物理机。在迁移期间,Hypervisor 监视源主机上已传输页面的任何更改,并在所有初始页面都已传输后开始传输这些更改。

它还在迁移期间估计传输速度,因此当剩余要传输的数据量将花费某个可配置的时间段时,它将暂停原始客户虚拟机,传输剩余数据,并在目标主机物理机上恢复相同的客户虚拟机。

MLX5 VF 实时迁移

本节的目的是演示如何对分配了 MLX5 VF 的 QEMU VM 执行基本实时迁移。本节不解释如何使用 libvirt 或直接通过 QEMU 创建 VM。

要求

以下是使用 MLX5 VF 实时迁移的要求。

组件

描述

适配器卡

  • ConnectX-7 ETH

  • BlueField-3 ETH

注意

源主机和目标主机必须使用相同的 PSID(需要相同的卡、相同的 CAP 和功能),并且具有相同的固件版本。

固件

  • 28.41.1000

  • 32.41.1000

内核

Linux v6.7 或更高版本

用户空间工具

iproute2 版本 6.2 或更高版本

QEMU

QEMU 8.1 或更高版本

Libvirt

Libvirt 8.6 或更高版本

设置

NVCONFIG

应启用 SR-IOV 并配置为支持启用实时迁移所需的 VF 数量。这可以通过以下命令实现

复制
已复制!
            

mlxconfig -d *<PF_BDF>* s SRIOV_EN=1 NUM_OF_VFS=4 VF_MIGRATION_MODE=2

其中

SRIOV_EN

启用单根 I/O 虚拟化 (SR-IOV)

NUM_OF_VFS

每个 PF 可以支持的虚拟功能 (VF) 的总数。

VF_MIGRATION_MODE

定义对 VF 迁移的支持。

  • 0x0: DEVICE_DEFAULT

  • 0x1: MIGRATION_DISABLED

  • 0x2: MIGRATION_ENABLED


内核配置

需要使用驱动程序 MLX5_VFIO_PCI 启用进行编译。(即 CONFIG_MLX5_VFIO_PCI)。

要加载驱动程序,请运行

复制
已复制!
            

modprobe mlx5_vfio_pci


QEMU

需要使用 VFIO_PCI 启用进行编译(默认情况下启用)。

如前所述,创建 VM 超出了本指南的范围,我们假设它们已经创建。但是,VM 配置应该是可迁移的配置,类似于在没有 SRIOV VF 的情况下完成的方式。

注意

以下步骤应在运行 VM 之前完成。

通过 libvirt

  1. 将 PF 设置为“switchdev”模式。

    复制
    已复制!
                

    devlink dev eswitch set pci/<PF_BDF> mode switchdev

  2. 创建将分配给 VM 的 VF。

    复制
    已复制!
                

    echo "1" > /sys/bus/pci/devices/<PF_BDF>/sriov_numvfs

  3. 将 VF 设置为可迁移。

    1. 查看 VF 的名称,运行

      复制
      已复制!
                  

      devlink port show

    2. 从 mlx5_core 解绑 VF,运行

      复制
      已复制!
                  

      echo '<VF_BDF>' > /sys/bus/pci/drivers/mlx5_core/unbind

    3. 使用 devlink 将每个 VF 设置为可迁移,运行

      复制
      已复制!
                  

      devlink port function set pci/<PF_BDF>/1 migratable enable

  4. 将 VF 分配给 VM。

    1. 编辑 VM XML 文件,运行

      复制
      已复制!
                  

      virsh edit <VM_NAME>

    2. 通过在“devices”标记下添加以下内容将 VF 分配给 VM

      复制
      已复制!
                  

      <hostdev mode='subsystem' type='pci' managed='no'> <driver name='vfio'/> <source> <address domain='0x0000' bus='0x08' slot='0x00' function='0x2'/> </source> <address type='pci' domain='0x0000' bus='0x09' slot='0x00' function='0x0'/> </hostdev>

      注意

      上面的域、总线、插槽和功能值是虚拟值,请将它们替换为您的 VF 值。

  5. 将目标 VM 设置为传入模式。

    1. 编辑目标 VM XML 文件,运行

      复制
      已复制!
                  

      virsh edit <VM_NAME>

    2. 通过在“domain”标记下添加以下内容,将目标 VM 设置为迁移传入模式

      复制
      已复制!
                  

      <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> [...] <qemu:commandline> <qemu:arg value='--incoming'/> <qemu:arg value='tcp:<DEST_IP>:<DEST_PORT>'/> </qemu:commandline> </domain>

      注意

      为了能够保存文件,还必须添加上面“domain”标记的 "xmlns:qemu" 属性。

  6. 将 VF 绑定到 mlx5_vfio_pci 驱动程序。

    1. 从 libvirt 管理中分离 VF,运行

      复制
      已复制!
                  

      virsh nodedev-detach pci_<VF_BDF>

    2. 从 vfio-pci 驱动程序解绑 VF(运行“virsh nodedev-detach”后,VF 会自动绑定到它),运行

      复制
      已复制!
                  

      echo '<VF_BDF>' > /sys/bus/pci/drivers/vfio-pci/unbind

    3. 设置驱动程序覆盖,运行

      复制
      已复制!
                  

      echo 'mlx5_vfio_pci' > /sys/bus/pci/devices/<VF_BDF>/driver_override

    4. 将 VF 绑定到 mlx5_vfio_pci 驱动程序,运行

      复制
      已复制!
                  

      echo '<VF_BDF>' > /sys/bus/pci/drivers/mlx5_vfio_pci/bind

直接通过 QEMU

  1. 将 PF 设置为“switchdev”模式。

    复制
    已复制!
                

    devlink dev eswitch set pci/<PF_BDF> mode switchdev

  2. 创建将分配给 VM 的 VF。

    复制
    已复制!
                

    echo "1" > /sys/bus/pci/devices/<PF_BDF>/sriov_numvfs

  3. 将 VF 设置为可迁移。

    1. 查看 VF 的名称,运行

      复制
      已复制!
                  

      devlink port show

    2. 从 mlx5_core 解绑 VF,运行

      复制
      已复制!
                  

      echo '<VF_BDF>' > /sys/bus/pci/drivers/mlx5_core/unbind

    3. 使用 devlink 将每个 VF 设置为可迁移,运行

      复制
      已复制!
                  

      devlink port function set pci/<PF_BDF>/1 migratable enable

  4. 将 VF 绑定到 mlx5_vfio_pci 驱动程序

    1. 设置驱动程序覆盖,运行

      复制
      已复制!
                  

      echo 'mlx5_vfio_pci' > /sys/bus/pci/devices/<VF_BDF>/driver_override

    2. 将 VF 绑定到 mlx5_vfio_pci 驱动程序,运行

      复制
      已复制!
                  

      echo '<VF_BDF>' > /sys/bus/pci/drivers/mlx5_vfio_pci/bind

通过 libvirt

  1. 在源主机和目标主机中启动 VM,运行

    复制
    已复制!
                

    virsh start <VM_NAME>

  2. 启用 switchover-ack QEMU 迁移功能。在源主机和目标主机中运行以下命令

    复制
    已复制!
                

    virsh qemu-monitor-command <VM_NAME> --hmp "migrate_set_capability return-path on"

    复制
    已复制!
                

    virsh qemu-monitor-command <VM_NAME> --hmp "migrate_set_capability switchover-ack on"

  3. [可选] 在源端配置迁移带宽和停机时间限制

    复制
    已复制!
                

    virsh qemu-monitor-command <VM_NAME> --hmp "migrate_set_parameter max-bandwidth <VALUE>" virsh qemu-monitor-command <VM_NAME> --hmp "migrate_set_parameter downtime-limit <VALUE>"

  4. 通过在源端运行迁移命令来启动迁移

    复制
    已复制!
                

    virsh qemu-monitor-command <VM_NAME> --hmp "migrate -d tcp:<DEST_IP>:<DEST_PORT>"

  5. 通过在源端运行 info 命令来检查迁移状态

    复制
    已复制!
                

    virsh qemu-monitor-command <VM_NAME> --hmp "info migrate"

    注意

    当迁移状态为“completed”时,表示迁移已成功完成。

直接通过 QEMU

  1. 在源主机中启动 VM,并为其分配 VF

    复制
    已复制!
                

    qemu-system-x86_64 [...] -device vfio-pci,host=<VF_BDF>,id=mlx5_1

  2. 在目标主机中启动 VM,并为其分配 VF 和“incoming”参数

    复制
    已复制!
                

    qemu-system-x86_64 [...] -device vfio-pci,host=<VF_BDF>,id=mlx5_1 -incoming tcp:<DEST_IP>:<DEST_PORT>

  3. 启用 switchover-ack QEMU 迁移功能。在源主机和目标主机中的 QEMU 监视器中运行以下命令

    复制
    已复制!
                

    migrate_set_capability return-path on

    复制
    已复制!
                

    migrate_set_capability switchover-ack on

  4. [可选] 在源端配置迁移带宽和停机时间限制

    复制
    已复制!
                

    migrate_set_parameter max-bandwidth <VALUE> migrate_set_parameter downtime-limit <VALUE>

  5. 通过在源端的 QEMU 监视器中运行迁移命令来启动迁移

    复制
    已复制!
                

    migrate -d tcp:<DEST_IP>:<DEST_PORT>

  6. 通过在源端的 QEMU 监视器中运行 info 命令来检查迁移状态

    复制
    已复制!
                

    info migrate

    注意

    当迁移状态为“completed”时,表示迁移已成功完成。

启用双端口虚拟 HCA (vHCA) 的使用,以跨两个以太网 (RoCE) NIC 网络端口共享 RDMA 资源(例如,MR、CQ、SRQ、PD),并将 NIC 显示为双端口设备。

MultiPort vHCA (MPV) VF 由 2 个“常规” VF 组成,每个端口一个 VF。创建可迁移的 MPV VF 需要与常规 VF 相同的步骤(请参阅 通过 libvirt 部分中的步骤)。这些步骤应在每个 NIC 端口上执行。MPV VF 流量不能使用 OVS 配置。必须定义 TC 规则来配置 MPV VF 流量。

注意

在 ConnectX-7 适配器卡中,迁移不能在超过 4 个 VF 上并行运行。管理员有责任控制这一点。

注意

实时迁移需要在源主机和目标主机上使用相同的固件版本。

© 版权所有 2025 NVIDIA。 上次更新时间:2025 年 2 月 12 日。