2、RoCE基础:RDMA与RoCE原理、RoCEv1/v2区别、网络架构与协议栈
2.1 从传统网络到RDMA:为什么需要绕过内核
传统以太网数据路径中,数据从网卡(NIC)到达主机内存,需要经过内核协议栈的多次拷贝、中断处理和上下文切换。以一次典型的TCP 10Gbps收发为例,CPU占用率往往超过60%,延迟高达数十微秒。这种“内核参与每一次数据移动”的模式,在高性能计算(HPC)、分布式存储和AI集群场景中成为严重瓶颈。
RDMA(Remote Direct Memory Access,远程直接内存访问)的核心思想是:让网卡硬件直接读写对端主机内存,绕过操作系统内核与CPU。发送方应用将数据缓冲区地址、长度和目的端内存地址封装成“工作请求”(Work Request,WR)提交给网卡,网卡硬件负责将数据从本地内存搬移到对端内存,完成后通过完成队列(Completion Queue,CQ)通知应用。整个过程无需内核参与数据面,CPU仅负责控制面管理。
RDMA三种实现技术对比
| 技术 | 承载网络 | 头开销 | 典型延迟 | 生态成熟度 |
|---|---|---|---|---|
| InfiniBand | IB专用网络(需IB交换机) | IB全局路由头(LRH+GRH) | 0.5~1μs | 高,但成本高、封闭 |
| RoCEv1 | 以太网(二层) | IB BTH+以太网头 | 1~2μs | 低,仅限二层 |
| RoCEv2 | 以太网(三层/UDP) | IB BTH+UDP+IP头 | 1~2μs | 高,可路由、成本低 |
2.2 RoCE协议栈:IB传输语义与以太网承载
RoCE(RDMA over Converged Ethernet)本质上是将InfiniBand的报文格式(IB Base Transport Header,BTH)封装在以太网帧中传输。它保留了IB的队列对(Queue Pair,QP)、可靠连接(RC)、不可靠数据报(UD)等传输语义,但物理层和链路层采用以太网。
RoCEv1的封装格式为:以太网头 + IB BTH + 有效载荷。由于没有IP层,RoCEv1只能在同一个二层广播域内通信,无法跨VLAN或子网路由。RoCEv2则引入UDP封装:以太网头 + IP头 + UDP头(目的端口4791)+ IB BTH + 有效载荷。UDP头中的目的端口号固定为4791,用于标识RoCEv2流量,使报文可以像普通UDP包一样被三层交换机路由。
2.3 RoCEv1与RoCEv2的关键差异
理解两者差异对网卡参数调优至关重要,因为不同版本对网卡、交换机和流控机制的要求完全不同。
- 可路由性:RoCEv1无IP头,MAC地址即寻址依据,广播域受限;RoCEv2通过UDP端口4791承载,可被标准IP路由器转发,支持跨数据中心二层/三层组网。
- 拥塞控制:RoCEv1依赖链路层PFC(Priority Flow Control)实现无损传输,但PFC可能引发队头阻塞;RoCEv2除PFC外,还可配合DCQCN(Data Center Quantized Congestion Notification)实现端到端拥塞控制,通过ECN标记和CNP(Congestion Notification Packet)反馈动态调整发送速率。
- MTU与性能:RoCEv2因增加IP+UDP头(28字节),有效载荷空间略减,但现代网卡支持巨型帧(MTU 9000),影响可忽略。实际调优中,RoCEv2更依赖网卡RSS(Receive Side Scaling)哈希和流表匹配能力。
- 兼容性:RoCEv1仅需二层交换机支持PFC;RoCEv2要求交换机支持ECN、DCQCN、PFC等完整无损以太网特性,对交换机缓冲和调度算法要求更高。
调优提示:在RoCEv2环境中,务必确认网卡驱动中UDP端口4791的哈希使能。若RSS哈希未覆盖UDP端口,所有RoCEv2流量将落入同一RX队列,导致单核CPU成为瓶颈,吞吐量骤降。可通过 ethtool -n eth0 rx-flow-hash udp4 检查哈希配置。
2.4 典型RoCE网络架构与协议栈全景
一个完整的RoCE集群通常采用Spine-Leaf(脊-叶)无阻塞架构。Leaf交换机连接服务器网卡,Spine交换机互联Leaf,所有链路均启用无损以太网配置。服务器侧,RoCE网卡通过PCIe 4.0/5.0连接CPU,驱动层(如mlx5_core)负责QP管理、内存注册和中断处理。
从协议栈视角看,RoCE报文在主机内的流转路径为:应用 → libibverbs/libfabric → 网卡驱动 → 网卡硬件(RDMA引擎)→ 以太网物理链路 → 交换机 → 对端网卡 → 对端内存。其中,网卡硬件中的GID(Global ID)表、QP上下文和CQ队列是调优的核心对象。
# 查看RoCE网卡GID表(RoCEv2使用RoCEv2类型GID)
$ rdma gid show
dev mlx5_0 port 1 index 0 address 02:00:00:00:00:00
dev mlx5_0 port 1 index 1 address 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
dev mlx5_0 port 1 index 2 address fe:80:00:00:00:00:00:00:00:00:00:00:00:00:00:00
2.5 案例:RoCEv2跨子网通信的故障排查
某分布式存储集群使用RoCEv2组网,服务器分布在两个不同IP子网(10.0.1.0/24和10.0.2.0/24),通过Spine-Leaf交换机互联。部署后发现跨子网RoCE通信延迟高达200μs,而同子网通信仅2μs。
排查过程:
- 检查交换机端口统计,发现跨子网流量存在大量ECN标记(Congestion Notification),说明交换机检测到拥塞。
- 使用
rdma res show qp查看QP状态,发现跨子网QP的发送速率被DCQCN算法降速至10Gbps(正常100Gbps)。 - 进一步检查发现,交换机上ECN阈值配置过小(默认8KB),而RoCEv2大包(MTU 4096)突发时极易触发ECN标记,导致DCQCN误判拥塞。
- 调整交换机ECN阈值至256KB,并启用网卡端DCQCN参数优化(如
cable_len、alpha因子),延迟恢复至3μs。
常见误区:不要将RoCEv2的UDP端口4791当作普通UDP流量处理。某些防火墙或安全策略会拦截非标准UDP端口,导致QP无法建立连接(状态卡在INIT或RTR)。务必在交换机ACL和主机iptables中放行UDP 4791,同时确保UDP校验和卸载(Checksum Offload)已开启,否则网卡会丢弃校验错误的RoCEv2报文。