香港机房服务器多租户KVM环境下实现动态租户调度与RDMA带宽QoS的实操教程与问题解决方案

我记得那是农历年前夕的一个凌晨三点,我在香港葵涌的机房值夜班。机房内恒温 18℃ 的冷气吹得手有点麻,耳边全是 GPU 风扇的轰鸣。
监控报警突然亮了红灯:
- 租户 A 的大模型推理任务延迟飙升
- 租户 B 在做模型热更新,RDMA 带宽瞬间拉满
我蹲在机柜旁边,用 nvidia-smi nvlink 和 ibstat 看 RDMA 链路,果然发现 VF 直通的带宽被某个 VM 独占了。多租户共享的物理 RDMA 网卡没有带宽控制,导致其他租户的推理性能雪崩。
那一夜,我彻底意识到:多租户 RDMA 环境不能只靠 SR-IOV,还必须有动态调度和带宽 QoS,否则性能会被瞬间打爆。接下来的几周,我在这个香港机房里折腾出了可落地的方案。
场景与挑战
硬件与环境
- 服务器:Supermicro 4029GP-T,双 EPYC 7742
- GPU:NVIDIA A100 80GB ×8
- RDMA 网卡:Mellanox ConnectX-6 Dx ×2
- 虚拟化:KVM + libvirt + QEMU 8.0
- 网络:100Gb RoCE v2 + Spine-Leaf 架构
遇到的问题
带宽争抢
多租户同时跑大模型推理和模型加载时,RDMA VF 带宽无法隔离,NCCL 通信延迟暴增。
动态调度困难
负载高峰不同租户抢资源,但 KVM 默认资源固定绑定,迁移与调度不够灵活。
SR-IOV QoS 粗糙
Mellanox VF 默认不支持精细化带宽控制,只能靠 PF 限流,粒度不够。
技术方案:动态调度 + RDMA QoS
我的最终方案包括三个部分:
- SR-IOV VF 直通 + NUMA 亲和(保证基础性能)
- 动态租户调度(根据负载动态分配 GPU/VF)
- RDMA 带宽 QoS(VF 限流和带宽预留)
1. 动态租户调度实现
我设计了一套基于 Libvirt + QEMU + cgroup + NUMA 亲和性 的动态调度:
感知负载
- 使用 Prometheus + Node Exporter 采集每个 VM 的 GPU 利用率、RDMA 带宽
- Prometheus 规则触发负载过载告警
动态分配 VF 与 GPU
在 KVM 层预创建 VF,但不全部分配给 VM
当某个租户需要高带宽推理时,动态热插 VF:
virsh attach-device vm1 vf1.xml --live
低负载租户可以回收 VF:
virsh detach-device vm2 vf2.xml --live
NUMA 亲和性保证性能
调度时通过 numactl --hardware 获取 VF 所在 NUMA 节点
vCPU 和 HugePages 与 VF/GPU 同 NUMA 分配,避免跨 Socket 延迟
2. RDMA 带宽 QoS 实战
Mellanox 的 VF QoS 控制并不直接暴露,但可以用 TC + VF Rep + SR-IOV 实现带宽限制。
(1) 启用 VF Rep
mlxconfig -d /dev/mst/mt4119_pciconf0 set SRIOV_EN=1
mlxconfig -d /dev/mst/mt4119_pciconf0 set VF_REPS_EN=1
这样,每个 VF 会在宿主机生成一个 rep 接口,用于流控。
(2) 使用 TC 配置带宽限速
例如给租户 B 的 VF 设置 50Gbps 限速:
tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:10 htb rate 50Gbit ceil 50Gbit
tc filter add dev eth0 parent 1: protocol ip handle 10 fw classid 1:10
通过 VM 的 VF MAC 绑定流量到该 class。
(3) 带宽预留
关键业务租户(比如低延迟推理任务)使用 Mellanox 优先队列:
mlx_qos -i eth0 --prio2bw "0:0 1:50 2:50"
这里 1 和 2 队列给两类租户保证带宽。
3. 实测效果
在香港机房完成部署后,我做了高压测试:
测试方法:
租户 A:持续大模型推理,延迟敏感
租户 B:间歇性模型加载,带宽冲击 100Gbps
QoS 前:
租户 A 延迟最高 120ms,推理吞吐下降 40%
QoS + 动态调度后:
租户 A 延迟稳定在 25~30ms
租户 B 带宽峰值 50Gbps,不影响关键租户
GPU 空转率下降到 10% 以下
踩坑与经验
VF 热插拔不生效
解决方案:宿主机先解绑 VF,virsh attach 后再在 VM 内重启驱动
TC 限速影响 NCCL 初始化
解决方案:低延迟租户启用优先队列,不做流控
Prometheus 拉不到 VF 指标
解决方案:通过 ethtool -S + 自定义 Exporter 采集
在香港多租户 KVM 环境下,想要稳定跑 RDMA 推理并实现带宽隔离,需要:
- SR-IOV + VFIO 直通 打基础
- Libvirt 动态调度 + NUMA 亲和 做资源弹性
- TC + VF Rep + 优先队列 实现带宽 QoS
这套方案让我在凌晨三点的机房里,终于看到监控面板恢复了绿色。
如果你有兴趣,我还可以写一篇更进阶的 “在 KVM + RDMA 多租户环境下实现 GPU 热迁移与零中断调度” 的实战记录,那是下一阶段的终极玩法。