上一篇 下一篇 分享链接 返回 返回顶部

香港服务器在KVM多租户环境下跑RDMA大规模AI推理的实操教程与问题解决方案

发布人:Minchunlin 发布时间:2025-08-05 09:14 阅读量:734


那是去年年底,我在香港葵涌的一个 Tier 3 机房,凌晨两点,机柜的门板因为冷风和风扇共振“咣咣”响。我们刚上了第四组 8 卡 A100 的服务器,这次不同的是,它们要运行在 KVM 虚拟化环境,因为客户要求多租户隔离:同一台物理服务器上要跑多个租户的 AI 推理任务。

前期物理机的 RDMA 我已经搞通了,但当时我一边盯着 dmesg 里 VFIO 的报错,一边被 GPU 计算延迟吓了一跳:裸金属 8~12μs 的 RDMA 延迟,虚拟机里飙到了 45μs,还伴随间歇性的超时。

我知道,这一夜免不了得在机房里用冷风陪着机柜慢慢调了。接下来的几周,我在香港机房经历了从 驱动、SR-IOV、NUMA 到 NCCL 调优 的整套深水区实践。

场景与挑战

硬件与网络环境

服务器型号:Supermicro 4029GP-T

  • CPU:AMD EPYC 7742 ×2(NUMA 2 节点)
  • GPU:NVIDIA A100 80GB ×8
  • NIC:Mellanox ConnectX-6 Dx 100GbE ×2
  • 虚拟化层:KVM + libvirt + QEMU 8.0
  • 网络:Spine-Leaf 架构,RoCE v2,Arista 7060 交换机

遇到的挑战

  • 多租户隔离:每个 VM 必须独占 1~2 张 GPU 和对应的 RDMA VF。
  • RDMA 性能衰减严重:SR-IOV 虚拟函数在 VM 内部无法直接复刻裸金属的低延迟。
  • NUMA 与 PCIe 拓扑复杂:VFIO 直通不绑 NUMA 会导致跨 Socket 内存访问延迟翻倍。
  • NCCL 初始化不稳定:多 VM 下 RDMA 通信容易出现卡死和超时。

技术方案与实操落地

我采用 “SR-IOV + VFIO 直通 + NUMA 亲和性 + RoCE v2” 的方案。

1. SR-IOV 与 VFIO 配置

开启 SR-IOV

在 BIOS 和操作系统同时开启 IOMMU:

# BIOS: IOMMU -> Enabled
# Kernel 参数:
amd_iommu=on iommu=pt

为 Mellanox 网卡开启 VF

echo 8 > /sys/class/net/ens2f0/device/sriov_numvfs

 

每张物理网卡划分 8 个 VF 给虚拟机使用。

绑定 VF 到 VFIO-PCI 驱动

lspci | grep Mellanox
echo "0000:3b:00.2" > /sys/bus/pci/drivers/mlx5_core/unbind
echo "0000:3b:00.2" > /sys/bus/pci/drivers/vfio-pci/bind

在 libvirt 中直通 VF

<hostdev mode='subsystem' type='pci' managed='yes'>
    <source>
        <address domain='0x0000' bus='0x3b' slot='0x00' function='0x2'/>
    </source>
</hostdev>

2. NUMA 亲和性与 CPU 绑核

在多租户场景下,如果 VM 的 vCPU 不与 VF 所在 NUMA 对齐,延迟会翻倍。

# 查看 VF NUMA 节点
cat /sys/bus/pci/devices/0000:3b:00.2/numa_node
# 假设返回 0,则 VM 的 CPU Pinning:
virsh vcpupin vm1 0 0-15

同时使用 HugePages 减少内存碎片和 TLB Miss:

echo 2048 > /proc/sys/vm/nr_hugepages

3. VM 内部 RDMA 配置

在虚拟机里,我安装了和宿主机匹配的 Mellanox OFED 驱动,并确保 RoCE v2 启用:

mst start
mlxconfig -d /dev/mst/mt4119_pciconf0 set ROCEV2=1

在 VM 内 NCCL 配置:

export NCCL_IB_HCA=mlx5_0
export NCCL_NET_GDR_LEVEL=2
export NCCL_SOCKET_IFNAME=eth0
export NCCL_IB_GID_INDEX=3

4. 踩坑与解决方案

(1) RDMA 性能衰减严重

问题:裸金属 8μs,虚拟机 45μs

原因:VF 在 VM 内默认不走 GDR(GPU Direct RDMA)路径

解决:

确认 GPU 直通,确保 nvidia-smi topo -m 中 VF 与 GPU 在同一 NUMA。

配置 NCCL_NET_GDR_LEVEL=2 并开启 GPUDirect。

(2) 多 VM 下 NCCL 初始化卡死

问题:8 个 VM 启动分布式推理时,NCCL 卡在初始化

原因:不同 VM 的 GID Index 默认不一致,IB 路由冲突

解决:

强制统一 VM 内的 NCCL_IB_GID_INDEX=3

在 /etc/hosts 固定内网 IP 对应

(3) VFIO 设备偶尔掉线

问题:VM 重启后 VF 不可见

原因:libvirt 直通和宿主机 NIC reset 冲突

解决:

配置 pci-stub 预绑定 VF,避免 reset 抢占驱动

实测效果

  • 端到端延迟:裸金属 812μs → VM 内 1418μs
  • 带宽利用率:95Gbps(接近裸金属)
  • 多租户推理吞吐:接近单租户物理机的 85~90%
  • GPU 空转率:由 30% 降低到 5%

经验总结

在香港机房这种多租户 AI 推理环境下跑 RDMA,需要:

  • SR-IOV + VFIO 直通 保证低延迟路径
  • NUMA 亲和性和 HugePages 避免跨 Socket 延迟
  • VM 内一致的 GID Index 确保 NCCL 初始化稳定
  • GPUDirect RDMA 结合 VF 才能接近裸金属性能

这是我在机房里花了几个不眠夜踩坑总结的方案,最终让 KVM 多租户 RDMA 推理达到了接近物理机的性能。

目录结构
全文