RDMA(Remote Direct Memory Access,远程直接内存访问)允许一台机器直接读写另一台机器的内存数据,绕过内核协议栈,省去了数据在用户态与内核态之间反复拷贝的开销。相比传统TCP/IP网络,RDMA能把延迟从几十微秒压到个位数微秒,同时CPU占用率大幅下降。正因如此,高性能计算、分布式存储(如Ceph、Lustre)、分布式数据库和AI训练集群几乎都把RDMA作为标配网络。但RDMA网络对配置的要求远高于普通以太网,任何一处参数不对都可能导致性能腰斩甚至连接中断,本文就系统讲解配置与验证的完整流程。

一、RDMA技术方案选型:InfiniBand、RoCE与iWARP怎么选
目前主流的RDMA实现有三条路线,理解它们的差异是配置工作的第一步。InfiniBand(简称IB)是专为RDMA设计的网络技术,从物理层到传输层都是独立体系,性能最强、延迟最低,但需要专用的IB网卡、IB交换机和线缆,成本较高。RoCE(RDMA over Converged Ethernet)则是在标准以太网上承载RDMA流量,复用现有的以太网交换机,其中RoCE v1基于二层以太网,已基本淘汰,当前生产环境应一律选用支持三层路由的RoCE v2。iWARP走TCP通道实现RDMA,兼容性最好,穿透防火墙能力强,但性能略逊,主要在Windows环境或跨广域网场景中使用。
选型的核心考量是性能需求与运维成本之间的平衡。对于AI训练、大规模HPC这类对延迟和带宽极其敏感的场景,InfiniBand仍是首选,NDR 400G的IB网络已经大规模商用。对于已有以太网基础设施、希望平滑升级的企业,RoCE v2是更务实的选择,25G、100G、200G的RoCE方案都很成熟。此外还要注意网卡选型,以Mellanox(现NVIDIA)ConnectX系列为例,ConnectX-5、ConnectX-6同时支持IB和以太网模式,可通过固件烧录切换链路类型;而部分低端型号只支持以太网,购买前务必确认固件规格支持所需的协议模式。
一个容易被忽视的细节是操作系统的支持情况。Linux内核从4.x开始已内置完整的RDMA栈(rdma-core用户态库配合内核模块),主流发行版开箱即用;Windows Server则需要安装NFExpress或WinOF-2驱动。建议集群统一使用较新的内核版本,避免老内核中存在的rdma_cm内存泄漏等已知问题。
二、集群RDMA网络的配置步骤
1. 网卡固件与驱动准备
拿到网卡后第一步是确认固件版本。使用mst status和flint -d /dev/mst/mt4123_pciconf0 q可以查看当前固件信息。固件版本必须与驱动版本匹配,否则可能出现端口无法链路、性能异常等问题。以NVIDIA网卡为例,先安装MFT工具包和MLNX_OFED驱动:
wget https://content.mellanox.com/ofed/MLNX_OFED-23.10-0.5.5.0/MLNX_OFED_LINUX-23.10-0.5.5.0-rhel9.3-x86_64.tgz tar xzf MLNX_OFED_LINUX-23.10-0.5.5.0-rhel9.3-x86_64.tgz cd MLNX_OFED_LINUX-23.10-0.5.5.0-rhel9.3-x86_64 ./mlnxofedinstall --all # 安装完成后重启并确认驱动加载 dracut -f reboot ibstat
如果需要从以太网模式切换到InfiniBand模式,使用mstconfig -d /dev/mst/mt4123_pciconf0 set LINK_TYPE_P1=IB,然后冷重启服务器生效。注意切换链路类型属于低层配置,热重启可能不生效,务必断电重启。
2. 子网管理器与IPoIB地址规划
InfiniBand网络必须至少有一台设备运行子网管理器(OpenSM),负责分配LID、管理路由和拓扑发现。规模较小的集群可以直接在某台计算节点上运行systemctl start opensm,生产环境建议把OpenSM部署在管理节点或IB交换机内置的管理模块上,并配置主备两个实例,避免单点故障。可用sminfo查询当前网络中的SM状态,正常应显示状态3(Active)。
对于RoCE网络,不需要OpenSM,但必须规划好IP地址并确保ARP正常解析。RoCE v2依赖UDP端口4791承载RDMA流量,如果集群之间有防火墙,需要放行该端口。为RoCE网卡配置IP时建议使用rdma link命令绑定,而不是依赖传统的ifcfg文件,这样能让RDMA资源与网络接口的关联更明确:
# 查看rdma链路状态 rdma link show # 将rdma设备与网卡绑定并设置IP ip addr add 192.168.100.11/24 dev ens1f0 ip link set ens1f0 up
3. 交换机侧无损网络调优
RoCE要跑出稳定性能,交换机必须配置无损以太网(Lossless Ethernet),核心是PFC(优先级流控)和ECN(显式拥塞通知)。典型做法是:网卡侧使用cma_roce_tos或mlnx_qos -i ens1f0 --trust dscp将RDMA流量的DSCP标记为26,交换机对DSCP 26的报文映射到优先级3并开启PFC。同时启用ECN阈值,让拥塞时发送端能主动降速(结合DCQCN算法)。以下是网卡侧的QoS配置示例:
mlnx_qos -i ens1f0 --trust dscp mlnx_qos -i ens1f0 --dscp2prio set,26,3 mlnx_qos -i ens1f0 --pfc enabled,0,0,0,1,0,0,0,0 # 开启ECN标记 sysctl -w net.ipv4.tcp_ecn=1 echo 1 > /sys/kernel/debug/mlx5/mlx5_0/cc_params/enable_ecn_marking
如果没有正确配置PFC,RoCE网络在拥塞时会出现大量重传和丢包,性能会从满线速暴跌到不足一半,这是RoCE部署中最常见的坑。InfiniBand网络则不存在这个问题,其流量控制是协议内置的,交换机开箱即用。
三、连通性与性能验证方法
1. 基础连通性检查
配置完成后,先分层验证。第一步用ibstat确认端口状态为Active且速率为预期值,用ibdev2netdev确认RDMA设备与网络接口的映射关系:
ibdev2netdev # 输出示例: # mlx5_0 port 1 ==> ens1f0 (Up) # mlx5_1 port 1 ==> ens1f1 (Down)
第二步用ibping测试RDMA链路连通性,服务端执行ibping -S,客户端执行ibping -G <服务端GID>。如果ibping不通但ibstat正常,多半是GID索引选择问题,可以用show_gids查看并指定正确的gid_idx。对于RoCE,还应使用rping -S和rping -c -a <服务端IP>验证基于rdma_cm的连接建立。
2. 带宽与延迟压测
perftest工具集是验证RDMA性能的标准手段。带宽测试用ib_write_bw、ib_read_bw和ib_send_bw,延迟测试用ib_write_lat。典型测试方式如下:
# 服务端 ib_write_bw --report_gbits -d mlx5_0 -R # 客户端 ib_write_bw --report_gbits -d mlx5_0 -R 192.168.100.11 # 双向延迟测试 ib_write_lat -d mlx5_0 -R # 服务端 ib_write_lat -d mlx5_0 -R 192.168.100.11 # 客户端
评估结果时要有一个合理预期:100Gbps的网卡实测吞吐通常在94到98Gbps之间,如果只有六七十Gbps,先检查MTU是否设置为jumbo frame(RoCE建议9000),再看PCIe插槽是否为x16 Gen3以上,单卡带宽受限于PCIe通道数的情况非常常见。延迟方面,IB网络write延迟一般在1微秒以内,RoCE通常在2微秒左右,明显偏高时应排查交换机PFC配置和网卡中断绑核情况。
3. 应用层面的验证与常见问题
底层压测通过后,还要在实际应用中验证。以NCCL为例,可设置NCCL_DEBUG=INFO观察其选择的传输方式,确认日志中出现Using network而非fallback到socket;分布式存储场景可用fio配合RDMA引擎压测,确认聚合带宽符合预期。常见的应用层问题包括:MPI程序报错找不到HCA,通常是--MCA btl openib参数未指定或udev规则缺失;NCCL多机训练卡死,往往是PFC未生效导致丢包重传,可在交换机上查看PFC统计计数确认。
日常运维中建议周期性巡检ibstat的链路状态、交换机端口错误计数以及ibdiagnet的体检报告。ibdiagnet是InfiniBand Fabric的全网诊断工具,能扫描出端口降速、SM异常、链路错误率超标的节点,是排查集群规模性性能衰退的利器。把这些检查纳入监控体系,RDMA网络就能长期稳定地支撑业务运行。