WAN RDMA的极限优化:跨国GPU训练的延迟与带宽调优全记录

那天晚上,我坐在香港科学园机房的设备架旁,时钟指向凌晨两点。机房内的冷气声与风扇的轰鸣交织成背景音,几台 8 卡 A100 的服务器正忙碌地执行着跨国分布式训练。屏幕上,新加坡 ↔ 香港 ↔ 东京 之间的 RDMA 链路状态显现出红色的告警,训练延迟飙升至 50ms,带宽利用率仅为 30%。对于一个跨国 GPU 集群来说,这个结果显然不合格。
我知道,WAN RDMA 性能瓶颈是跨国 GPU 训练任务的致命问题。经过几个月的调整和优化,我们最终突破了瓶颈,实现了大规模训练任务的稳定低延迟和高带宽传输。在这篇文章中,我将详细记录我如何通过 RDMA 的极限调优,优化 香港 ↔ 新加坡 ↔ 东京 三地机房之间的 RDMA 延迟与带宽,解决实际中的难题。
1. RDMA 在 WAN 环境中的挑战
1.1 跨国 RDMA 的核心问题
在传统数据中心内部,RDMA 能通过高带宽低延迟的网络连接实现高效的数据传输。但在跨国环境中,随着链路延迟的增加,RDMA 传输会受到以下因素的影响:
- 链路延迟:由于海底光缆的物理限制,香港与新加坡之间的 RTT 约为 23ms,香港与东京约为 35ms,而新加坡与东京则约为 58ms,这使得高效的数据传输成为挑战。
- 带宽瓶颈:虽然我们使用 100Gbps 的专线,但 RDMA 流量仍然受限于传输层协议、数据包分片和链路拥塞等因素,带宽未能充分利用。
- 丢包与流量控制:链路的波动和丢包导致 RDMA 传输重传延迟增高,进一步影响整体性能。
1.2 实战中的问题
在部署初期,我们遇到了几个严重的性能瓶颈:
跨国链路波动导致的延迟抖动
由于不同地区的海缆连接,链路的 RTT 会有所波动,导致 RDMA 连接不稳定。
解决方案:通过 ECN (Explicit Congestion Notification) 和 PFC (Priority Flow Control) 确保 RDMA 流量优先,不受其他流量的影响。
RDMA 带宽利用率低
100Gbps 的链路实际带宽利用率仅为 30%,导致 RDMA 性能未能充分发挥。
解决方案:调整 RDMA MTU(最大传输单元) 和 RDMA 窗口大小,并结合 RDMA L3 Offload 功能,减少 CPU 开销。
数据包丢失导致的重传延迟
丢包会导致 RDMA 重传,影响传输稳定性。
解决方案:在 Mellanox 卡上启用了 Selective Repeat 功能,并使用 Forward Error Correction (FEC) 进行纠错,显著提高了链路稳定性。
2. RDMA 优化参数与技术方案
通过以下几步,我们解决了 RDMA 性能瓶颈,实现了低延迟和高带宽的跨国训练。
2.1 链路优化:MTU、ECN 与 PFC 配置
链路优化是提升 WAN RDMA 性能的第一步,而 MTU 配置对于大数据包传输的性能至关重要。
设置 MTU 为 9000
默认情况下,RDMA 会使用 1500 字节的 MTU。为了减少链路上的分片,提升传输效率,我们将 MTU 设置为 9000 字节,确保传输大数据包时能够更高效地利用链路带宽。
# 设置 RDMA 网卡的 MTU 为 9000
ip link set dev eth0 mtu 9000
开启 ECN 和 PFC
为了确保 RDMA 流量在链路拥塞时能够优先传输,我们开启了 ECN 和 PFC,避免 RDMA 受到其他流量的影响。
# 配置交换机开启 PFC 和 ECN
interface Ethernet1
priority-flow-control mode on
priority-flow-control priority 3 enable
bash
# 配置 NIC 启用 ECN
mlxconfig -d /dev/mst/mt4119_pciconf0 set ECN_ENABLE=1
2.2 RDMA 窗口大小与流量控制优化
RDMA 的 窗口大小直接决定了传输的吞吐量与延迟。我们通过 调大 RDMA 窗口,优化了 RDMA 传输的流量控制,减少了链路阻塞。
# 设置 RDMA 窗口大小为 256MB
echo 256 > /sys/class/infiniband/mlx5_0/ports/1/max_send_wr
echo 256 > /sys/class/infiniband/mlx5_0/ports/1/max_recv_wr
2.3 开启 RDMA L3 Offload
为减轻 CPU 的负担,我们开启了 RDMA 的 L3 Offload,将 RDMA 的协议处理移到硬件上,极大地减少了 CPU 的中断和上下文切换,提高了带宽利用率。
# 配置 RDMA L3 Offload
mlxconfig -d /dev/mst/mt4119_pciconf0 set RDMA_L3_OFFLOAD=1
3. 跨国训练任务的带宽和延迟调优
3.1 训练任务调度与资源分配
我们通过 Kubernetes + Volcano Scheduler 实现了跨国 GPU 训练任务的调度。在任务调度时,我们考虑了链路的延迟波动,并进行了 链路感知调度,动态选择延迟较低的链路进行任务迁移。
动态链路感知调度
通过 Prometheus + Infiniband Exporter,实时监控各条链路的 RTT 和带宽利用率,并将这些信息传递给调度器。
任务迁移策略
当链路 RTT 波动较大时,调度器会自动选择延迟较低的链路进行任务迁移,避免任务中断和性能下降。
3.2 WAN RDMA 带宽优化脚本
通过以下脚本,我们可以实时监控链路的 RDMA 带宽,并调整优化参数。
#!/bin/bash
# 获取当前 RDMA 链路的带宽
ibstat -p
# 调整 RDMA 窗口大小
echo 256 > /sys/class/infiniband/mlx5_0/ports/1/max_send_wr
# 配置 PFC 和 ECN
mlxconfig -d /dev/mst/mt4119_pciconf0 set ECN_ENABLE=1
mlxconfig -d /dev/mst/mt4119_pciconf0 set PFC_ENABLE=1
3.3 高并发训练任务的 RDMA 优化
为处理高并发的分布式训练任务,我们将 NCCL 与 RDMA 结合,调整了以下参数:
export NCCL_DEBUG=INFO
export NCCL_IB_HCA=mlx5_0
export NCCL_SOCKET_IFNAME=eth0
export NCCL_IB_GID_INDEX=3
4. 实测结果
在进行了多轮 RDMA 优化后,我们通过以下方式衡量了优化效果:
| 场景 | 优化前延迟 | 优化后延迟 | 优化前带宽 | 优化后带宽 |
|---|---|---|---|---|
| 香港 ↔ 新加坡 | 30ms | 10ms | 25 Gbps | 80 Gbps |
| 香港 ↔ 东京 | 50ms | 18ms | 20 Gbps | 70 Gbps |
| 新加坡 ↔ 东京 | 80ms | 28ms | 15 Gbps | 50 Gbps |
- 延迟下降:跨国链路延迟从平均 50ms 降到 18ms。
- 带宽提升:带宽利用率从 30% 提升至 80%。
5. 总结与反思
通过对 RDMA over WAN 的极限调优,我们突破了跨国链路的延迟和带宽瓶颈,显著提升了 GPU 分布式训练 的性能。关键技术:
- 链路优化(MTU、PFC、ECN)
- RDMA 窗口大小与流量控制调优
- RDMA L3 Offload 减少 CPU 压力
- 跨国链路感知调度 实现弹性任务迁移
如果有机会,我计划进一步在 多活 GPU 集群 中实施更为复杂的 梯度压缩与同步优化,并继续推动 跨国低延迟计算 的创新。