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

那是去年年底,我在香港葵涌的一个 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 推理达到了接近物理机的性能。