SR-IOV 实时迁移
此功能仅在以太网模式下受支持。
实时迁移是指将运行在一个物理主机上的客户虚拟机 (VM) 移动到另一个主机,而不会中断正常操作或对最终用户造成其他不利影响的过程。
使用迁移过程对于以下方面很有用
负载均衡
硬件独立性
节能
地理迁移
容错
迁移的工作原理是将客户虚拟机的内存状态和任何虚拟化设备发送到目标主机物理机。迁移可以是实时的或非实时的,在实时情况下,迁移不会中断用户操作,并且对用户是透明的,如下节所述。
当使用非实时迁移过程时,Hypervisor 会暂停客户虚拟机,然后将客户虚拟机内存的映像移动到目标主机物理机。然后,客户虚拟机在目标主机物理机上恢复,并且客户虚拟机在源主机物理机上使用的内存将被释放。完成此类迁移所需的时间取决于网络带宽和延迟。如果网络正经历大量使用或低带宽,则迁移将花费比预期更长的时间。
当使用实时迁移过程时,客户虚拟机在源主机物理机上继续运行,同时其内存页被传输到目标主机物理机。在迁移期间,Hypervisor 监视源主机上已传输页面的任何更改,并在所有初始页面都已传输后开始传输这些更改。
它还在迁移期间估计传输速度,因此当剩余要传输的数据量将花费某个可配置的时间段时,它将暂停原始客户虚拟机,传输剩余数据,并在目标主机物理机上恢复相同的客户虚拟机。
MLX5 VF 实时迁移
本节的目的是演示如何对分配了 MLX5 VF 的 QEMU VM 执行基本实时迁移。本节不解释如何使用 libvirt 或直接通过 QEMU 创建 VM。
要求
以下是使用 MLX5 VF 实时迁移的要求。
组件 | 描述 |
适配器卡 |
注意
源主机和目标主机必须使用相同的 PSID(需要相同的卡、相同的 CAP 和功能),并且具有相同的固件版本。 |
固件 |
|
内核 | 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 迁移的支持。
|
内核配置
需要使用驱动程序 MLX5_VFIO_PCI 启用进行编译。(即 CONFIG_MLX5_VFIO_PCI)。
要加载驱动程序,请运行
modprobe mlx5_vfio_pci
QEMU
需要使用 VFIO_PCI 启用进行编译(默认情况下启用)。
如前所述,创建 VM 超出了本指南的范围,我们假设它们已经创建。但是,VM 配置应该是可迁移的配置,类似于在没有 SRIOV VF 的情况下完成的方式。
以下步骤应在运行 VM 之前完成。
通过 libvirt
将 PF 设置为“switchdev”模式。
devlink dev eswitch set pci/<PF_BDF> mode switchdev
创建将分配给 VM 的 VF。
echo
"1"
> /sys/bus/pci/devices/<PF_BDF>/sriov_numvfs将 VF 设置为可迁移。
查看 VF 的名称,运行
devlink port show
从 mlx5_core 解绑 VF,运行
echo
'<VF_BDF>'
> /sys/bus/pci/drivers/mlx5_core/unbind使用 devlink 将每个 VF 设置为可迁移,运行
devlink port function set pci/<PF_BDF>/
1
migratable enable
将 VF 分配给 VM。
编辑 VM XML 文件,运行
virsh edit <VM_NAME>
通过在“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 值。
将目标 VM 设置为传入模式。
编辑目标 VM XML 文件,运行
virsh edit <VM_NAME>
通过在“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"
属性。
将 VF 绑定到 mlx5_vfio_pci 驱动程序。
从 libvirt 管理中分离 VF,运行
virsh nodedev-detach pci_<VF_BDF>
从 vfio-pci 驱动程序解绑 VF(运行“virsh nodedev-detach”后,VF 会自动绑定到它),运行
echo
'<VF_BDF>'
> /sys/bus/pci/drivers/vfio-pci/unbind设置驱动程序覆盖,运行
echo
'mlx5_vfio_pci'
> /sys/bus/pci/devices/<VF_BDF>/driver_override将 VF 绑定到 mlx5_vfio_pci 驱动程序,运行
echo
'<VF_BDF>'
> /sys/bus/pci/drivers/mlx5_vfio_pci/bind
直接通过 QEMU
将 PF 设置为“switchdev”模式。
devlink dev eswitch set pci/<PF_BDF> mode switchdev
创建将分配给 VM 的 VF。
echo
"1"
> /sys/bus/pci/devices/<PF_BDF>/sriov_numvfs将 VF 设置为可迁移。
查看 VF 的名称,运行
devlink port show
从 mlx5_core 解绑 VF,运行
echo
'<VF_BDF>'
> /sys/bus/pci/drivers/mlx5_core/unbind使用 devlink 将每个 VF 设置为可迁移,运行
devlink port function set pci/<PF_BDF>/
1
migratable enable
将 VF 绑定到 mlx5_vfio_pci 驱动程序
设置驱动程序覆盖,运行
echo
'mlx5_vfio_pci'
> /sys/bus/pci/devices/<VF_BDF>/driver_override将 VF 绑定到 mlx5_vfio_pci 驱动程序,运行
echo
'<VF_BDF>'
> /sys/bus/pci/drivers/mlx5_vfio_pci/bind
通过 libvirt
在源主机和目标主机中启动 VM,运行
virsh start <VM_NAME>
启用 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"
[可选] 在源端配置迁移带宽和停机时间限制
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>"
通过在源端运行迁移命令来启动迁移
virsh qemu-monitor-command <VM_NAME> --hmp
"migrate -d tcp:<DEST_IP>:<DEST_PORT>"
通过在源端运行 info 命令来检查迁移状态
virsh qemu-monitor-command <VM_NAME> --hmp
"info migrate"
注意当迁移状态为“completed”时,表示迁移已成功完成。
直接通过 QEMU
在源主机中启动 VM,并为其分配 VF
qemu-system-x86_64 [...] -device vfio-pci,host=<VF_BDF>,id=mlx5_1
在目标主机中启动 VM,并为其分配 VF 和“incoming”参数
qemu-system-x86_64 [...] -device vfio-pci,host=<VF_BDF>,id=mlx5_1 -incoming tcp:<DEST_IP>:<DEST_PORT>
启用 switchover-ack QEMU 迁移功能。在源主机和目标主机中的 QEMU 监视器中运行以下命令
migrate_set_capability
return
-path onmigrate_set_capability switchover-ack on
[可选] 在源端配置迁移带宽和停机时间限制
migrate_set_parameter max-bandwidth <VALUE> migrate_set_parameter downtime-limit <VALUE>
通过在源端的 QEMU 监视器中运行迁移命令来启动迁移
migrate -d tcp:<DEST_IP>:<DEST_PORT>
通过在源端的 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 上并行运行。管理员有责任控制这一点。
实时迁移需要在源主机和目标主机上使用相同的固件版本。