RoCE无损网络必须同时满足PFC精确启停、ECN早期介入、DSCP与802.1p映射一致三个硬性条件,缺一不可;否则将导致训练中随机卡死、All-Reduce超时及NCCL错误。

RoCE 无损网络不是“配通就行”,而是必须同时满足 PFC 精确启停、ECN 早期介入、DSCP 与 802.1p 映射一致 三个硬性条件,缺一不可。否则看似连通,训练中随机卡死、All-Reduce 超时、NCCL 报 NCCL_INVALID_USAGE 或 NCCL_SYSTEM_ERROR 都是大概率事件。
确认网卡和内核是否真正支持 RoCEv2
很多用户卡在第一步:以为装了驱动就万事大吉,其实 ConnectX-3 只支持 RoCEv1,而 RoCEv1 无法跨子网,且不走 IP 层,现代分布式训练根本不能用。
- 执行
lspci | grep Mellanox,确认是 ConnectX-4/5/6(或 Intel E810+ 支持 RoCEv2 的型号) - 检查固件是否启用 RoCEv2 模式:
ibstat -p输出中port_state应为Active,且link_layer显示Ethernet;若显示InfiniBand,说明仍运行在 IB 模式 - 验证内核模块加载是否正确:
lsmod | grep -E "(rdma|mlx|ib)"中必须有ib_uverbs、rdma_rxe(仅 Soft-RoCE)、mlx5_ib(硬件 RoCE)等,且无报错 - 关键检查点:
cat /sys/class/infiniband/*/ports/*/gids/0应返回一个 IPv4 或 IPv6 地址格式的 GID,而非全零 —— 这是roce_gid_mgmt.c模块自动同步成功的标志
配置 PFC:必须按优先级粒度启用,不能全局开
PFC 不是“打开就安全”,它是逐优先级的反压机制。RoCEv2 流量默认使用 DSCP 值 46(EF),对应 802.1p 优先级 3,所以 PFC 必须只对优先级 3 启用,其他优先级(如管理流量用的优先级 0)必须禁用,否则会引发交换机缓存死锁。
- 在 Linux 主机侧,通过 DCB 工具配置:
dcbtool sc eth0 dcb on,再执行dcbtool sc eth0 pfc e:1,0,0,1,0,0,0,0—— 表示仅开启优先级 3(索引从 0 开始,第 4 位)的 PFC - 验证是否生效:
dcbtool gc eth0输出中pfc: enable 0x08(二进制00001000)才正确;若为0xff,说明所有优先级都开了,立刻回退 - 注意:PFC 必须在**两端端口(服务器 + 交换机)同时启用同一优先级**,单边开启等于没开,还会导致 PFC pause 帧被丢弃
配置 ECN:需匹配 RoCEv2 的 UDP 封装特性
ECN 在 RoCEv2 中不是作用于 IP 层本身,而是依赖网卡硬件解析 UDP 头并标记 CE 位。因此仅配置内核 net.ipv4.tcp_ecn 是无效的,必须走 RDMA 栈专用路径。
- 启用 ECN 的前提:网卡固件支持(ConnectX-5 FW ≥ 16.29.2006,需用
mlxfwmanager升级),且内核启用CONFIG_INFINIBAND_IPOIB_CM=y - 设置 ECN 参数:
echo 1 > /sys/class/infiniband/mlx5_0/ports/1/ecn/enable(路径依实际设备名调整) - 指定触发阈值(避免过早限速):
echo 1048576 > /sys/class/infiniband/mlx5_0/ports/1/ecn/cur_thresh(单位字节,建议设为交换机端口缓存的 70%) - 验证 ECN 是否工作:用
ibstat查看端口计数器中ecn_marked字段是否随流量上升;若始终为 0,说明 ECN 未真正激活
DSCP-to-802.1p 映射错位是静默故障主因
RoCEv2 流量由内核协议栈发出时,DSCP 值(如 46)需被网卡硬件准确映射为 802.1p 优先级(3)。一旦映射表错位,PFC 和 ECN 就完全失效 —— 流量走了“高优先级”通道,但控制策略却绑在“低优先级”上。
- 查看当前映射:
tc qdisc show dev eth0,确认存在handle ffff: prio类,并用tc class show dev eth0检查 band 3 是否绑定到 DSCP 46 - 手动修正映射(以 Mellanox 为例):
mlxconfig -d /dev/mst/mt4115_pciconf0 set ROCE_DSCP_TO_PCP_MAP=0,0,0,3,0,0,0,0—— 表示 DSCP 3(即十进制 24)映射到 PCP 3,但 RoCEv2 实际用 DSCP 46(二进制 101110),所以要算准位移:46 ÷ 8 = 5 余 6 → 第 6 个字节位置填 3 - 最稳妥方式:直接在交换机侧统一用 DSCP 46 标记 RoCE 流量,并关闭主机侧所有软件 QoS,让硬件接管全部映射
真正难的不是敲完命令,而是确认每一层映射都对齐:DSCP 值 → 802.1p 优先级 → PFC 开关位 → ECN 触发门限 → 交换机缓存水位。任何一层偏移,都会让“无损”变成“间歇性丢包”,而这种丢包在 NCCL 日志里往往只体现为超时重试,不会直接报错。


















