在分布式存储和AI训练场景里,节点之间搬移数据的规模越来越大,传统TCP/IP协议栈带来的CPU开销和延迟已经成为明显的瓶颈。RDMA技术允许网卡绕过内核协议栈直接读写对端内存,而RoCE(RDMA over Converged Ethernet)则让这种能力跑在普通的以太网交换机上,不需要专门的InfiniBand硬件。但RoCE并不是插上网线就能用的,它对网络的丢包率极为敏感,一次万分之一量级的丢包就可能让吞吐断崖式下跌,因此配置RoCE的本质是配置一张“无损以太网”。

一、先分清RoCEv1和RoCEv2
很多初学者在配置时第一步就走错,原因是没搞清楚自己用的是哪个版本的RoCE。RoCEv1把RDMA流量封装在以太网帧里直接传输,工作在二层,不能跨子网路由,实际部署中已经很少使用。RoCEv2则在外层再包了一层UDP头和IP头,端口号固定为4791,支持三层路由,可以跨交换机、跨机房传输,是目前的主流选择。
确认方法很简单,在主机上执行ibstat或者rdma link show,观察端口状态和协议类型。如果是Mellanox的网卡,还可以通过mlxconfig -d /dev/mst/mt4123_pciconf0 query | grep ROCE查看固件层面的RoCE模式。需要注意的是,部分网卡默认工作在RoCEv2模式,但也有些旧固件需要手动切换,切换后要重启主机才能生效。
版本选错的典型症状是:同一个二层网络内通信正常,一旦跨网段就完全不通,抓包能看到大量UDP 4791端口的数据包被路由器丢弃。遇到这种情况,先怀疑版本再排查其他问题。
二、交换机端配置:PFC与ECN
无损网络的核心是PFC(Priority-based Flow Control,基于优先级的流量控制)。RoCE流量通常映射到某个特定优先级(最常见的是优先级3或4),当交换机在该优先级的出端口发生拥塞时,会向上游发送PAUSE帧,让上游暂时停止发送,从而避免缓冲区溢出丢包。以华为CloudEngine交换机为例,配置如下:
# 开启全局PFC(以优先级3为例) dcb pfc enable dcb pfc priority 3 # 在RoCE流量入端口应用 interface 25GE1/0/1 dcb pfc enable mode auto trust 8021p pfc buffer 9 cells xon 2 cells threshold 3 cells headroom 16 cells # 开启ECN标记 qos wred ecn enable qos wred ecn weighting 80
思科Nexus系列对应的命令是priority-flow-control mode auto配合set qos-group完成优先级映射。不同厂商命令差异较大,但配置逻辑一致:指定PFC优先级、分配足够的headroom缓冲、开启ECN。headroom的容量计算与线速和链路RTT相关,公式大致是带宽乘以前传时延再除以报文大小,配置过小会导致PAUSE帧来不及生效就丢包,配置过大则挤占共享缓冲。
ECN(Explicit Congestion Notification)是PFC的补充机制。PFC只能阻止丢包,不能从源头降低发送速率,长时间大流量下容易触发PFC风暴甚至死锁。ECN通过在IP头中打标记,通知接收端降低RoCE的发送速率,让拥塞在源头就被抑制。生产环境强烈建议PFC与ECN配合使用,同时开启watchdog功能监测PFC风暴。
三、主机侧网卡配置与验证
主机侧的第一步是确认网卡支持RoCE并安装正确的驱动。Mellanox网卡安装MLNX_OFED驱动后,通过mst status和ibv_devinfo确认设备状态。然后设置网络参数,关键项包括MTU、PFC模式以及流量映射:
# 查看网卡当前DCBX和PFC状态 mlnx_qos -i eth0 # 将RDMA流量映射到优先级3,开启PFC mlnx_qos -i eth0 --pfc 0,0,0,1,0,0,0,0 # 设置交换机信任模式为标准 mlnx_qos -i eth0 --trust dscp # 开启网卡ECN应答(接收侧) echo 1 > /sys/module/mlx5_core/parameters/ctx_ecn_send_enabled # 设置巨型帧,两端和中间交换机需一致 ip link set eth0 mtu 9000
MTU建议设置为9000的巨型帧,可以减少中断次数和协议头开销,但要注意整条链路上的所有设备必须一致,否则会出现分片或黑洞。DSCP信任模式下,RoCE报文的DSCP值默认为26,交换机据此映射到对应队列;如果交换机采用802.1p信任,则要确保网卡侧的优先级标记与交换机的映射规则匹配,两边不一致是PFC不生效的最常见原因。
四、连通性测试与常见问题排查
配置完成后,用ib_write_bw和ib_send_latency做吞吐和延迟测试。服务端执行ib_write_bw -d mlx5_0 -R,客户端执行ib_write_bw -d mlx5_0 -R 目标IP,参数R表示使用RDMA CM建立连接。如果吞吐远低于线速,或者延迟抖动很大,基本可以判定存在静默丢包。
# 查看网卡各优先级的收发和暂停帧计数 ethtool -S eth0 | grep -i pause # 查看PFC风暴和拥塞丢弃计数 cat /sys/class/infiniband/mlx5_0/ports/1/hw_counters/*/np_cnp_sent
排查顺序建议是:先看两端PAUSE帧计数是否对称增长,确认PFC协商成功;再看交换机端口是否出现拥塞丢弃;最后确认ECN标记是否在生效。如果pause_tx有计数但对端pause_rx没有,说明链路上PFC被降级或优先级映射错了。另外要避免在一个端口上同时开启传统802.3x流控和PFC,两者冲突会导致链路直接震荡。对于多节点大规模集群,还建议逐对验证连通性后再接入业务,因为RoCE的问题往往只在特定流量模型下暴露,事后排查成本远高于事前验证。