RDMA网络架构与传输模式
RDMA(Remote Direct Memory Access)允许网络中的计算机直接访问其他计算机的内存,无需CPU和操作系统介入,实现微秒级延迟和极高吞吐量。在AI大模型训练、高性能计算和分布式存储场景中,RDMA网络已成为标准配置。RDMA有三种实现方式:InfiniBand、RoCE(RDMA over Converged Ethernet)和iWARP。
InfiniBand是专用网络协议,提供最低延迟和最高带宽,但需要专用硬件。RoCE在以太网上实现RDMA,复用现有网络基础设施,部署成本更低。RoCEv2是当前主流版本,支持三层路由。iWARP基于TCP/IP,兼容性最好但性能最差,实际生产中较少使用。
InfiniBand网络配置与调优
InfiniBand网络通过Subnet Manager(SM)管理子网配置。OpenSM是开源的SM实现,随Mellanox OFED驱动包提供。
# 安装Mellanox OFED驱动
yum install -y mlnx-ofed-all
# 加载内核模块
modprobe ib_core mlx5_core ib_ipoib ib_ucm ib_uverbs rdma_ucm
# 启动OpenSM
systemctl enable opensm && systemctl start opensm
# 查看HCA状态
ibstat
# CA 'mlx5_0'
# Port 1: State: Active, Rate: 200 (HDR)
# 性能调优参数
# /etc/modprobe.d/mlnx.conf
options mlx5_core log_num_mtt=24
options ib_core rdma_dev_reset_on_close=1
# 系统网络参数调优
sysctl -w net.core.rmem_max=2147483647
sysctl -w net.core.wmem_max=2147483647
sysctl -w net.core.rmem_default=16777216
sysctl -w net.core.wmem_default=16777216
# ib_write_bw基准测试
ib_write_bw -d mlx5_0 --report_gbits # 服务端
ib_write_bw -d mlx5_0 192.168.100.1 --report_gbits # 客户端
# ib_send_lat延迟测试
ib_send_lat -d mlx5_0 # 服务端
ib_send_lat -d mlx5_0 192.168.100.1 # 客户端
HDR InfiniBand理论带宽为200Gbps,实际部署中ib_write_bw测试应达到180Gbps以上。单边延迟ib_send_lat应在1微秒以内。如果带宽不达标,检查PCIe带宽是否被其他设备共享、HCA固件版本是否最新、SM是否正确配置了子网。
RoCEv2配置与拥塞控制
RoCEv2在以太网上运行RDMA,需要支持DCB(Data Center Bridging)的交换机配合PFC(Priority Flow Control)和ECN(Explicit Congestion Notification)来实现无损网络。
# 配置RoCEv2网卡参数
mlxconfig -d /dev/mt4099 set RoCE_EN=1
# 配置DCB PFC(无损以太网)
dcbtool sc eth0 pfc pfc on:e3a3a3a3
# 配置ECN标记
tc qdisc add dev eth0 root fq_codel ecn
# NVIDIA RoCE调优
options mlx5_core roce_en=1 num_tc=1 cq_eq_repack=1
# 使用rping验证RoCE连通性
rping -s -C 10 -a 192.168.100.1 # 服务端
rping -c -C 10 -I mlx5_0 192.168.100.1 # 客户端
# 交换机端PFC配置(Mellanox Spectrum)
mlnx_qos --pfc 0,0,0,1,0,0,0,0
mlnx_qos --ecn 3 --min 150K --max 1M --prob 100
echo '26 3' > /sys/class/net/eth0/qdisc_rx/dscp_prio
RoCEv2的PFC Headroom计算需要根据MTU和PFC暂停时间来配置交换机buffer。PFC配置不当会导致RoCE性能不稳定甚至链路抖动。生产环境建议使用NVIDIA提供的mlnx_qos工具自动计算和配置buffer参数。
RDMA性能测试与诊断
使用perftest套件全面评估RDMA网络性能,覆盖带宽、延迟和消息速率三个维度。
#!/bin/bash
SERVER_IP='192.168.100.1'
DEV='mlx5_0'
# 写带宽测试(不同消息大小)
for size in 64 256 1024 4096 65536 1048576; do
ib_write_bw -d $DEV -s $size --report_gbits $SERVER_IP | tail -1
done
# 读延迟测试
for size in 2 8 32 64 256 1024; do
ib_read_lat -d $DEV -s $size $SERVER_IP | grep latency | tail -1
done
# 多连接并发带宽
ib_write_bw -d $DEV -n 16 --report_gbits $SERVER_IP | tail -1
# NUMA亲和性检查
numactl --cpunodebind=0 --membind=0 ib_write_bw -d $DEV $SERVER_IP
# 诊断
ibstat -d $DEV | grep -E 'SymbolError|LinkError'
cat /sys/class/infiniband/$DEV/ports/1/counters/port_rcv_retransmits
生产环境部署最佳实践
在大规模RDMA网络部署中,需要关注拓扑设计、故障隔离和监控告警三个层面。InfiniBand网络使用Fat-Tree拓扑,保证任意两个计算节点间等距通信。RoCEv2网络推荐使用Spine-Leaf拓扑,配合ECMP实现多路径负载均衡。
#!/usr/bin/env python3
import subprocess, time, os
def collect_perf_counters(dev='mlx5_0', port='1'):
base = f'/sys/class/infiniband/{dev}/ports/{port}/counters'
counters = {}
for f in os.listdir(base):
with open(os.path.join(base, f)) as fh:
counters[f'ib_{dev}_port{port}_{f}'] = int(fh.read().strip())
return counters
while True:
for k, v in collect_perf_counters().items():
print(f'rdma_{k} {v}')
time.sleep(15)
RDMA网络的常见故障模式包括PFC死锁、ECN风暴和HCA固件bug。部署时应为每个RoCEv2端口配置独立的PFC优先级,避免与存储流量混用。HCA固件建议保持在厂商推荐版本,升级前在测试环境验证。定期运行ibdiagnet进行网络健康检查,确保链路误码率在可接受范围内。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/rdma-wang-luo-pei-zhi-shi-zhan-infiniband-yu-roce-di-yan/