3. RDMA核心技术
RDMA(Remote Direct Memory Access,远程直接内存访问)的核心价值在于绕过操作系统内核与CPU参与,直接在网卡与应用程序内存之间搬运数据。然而,RDMA并非单一技术标准,而是涵盖三种主要协议实现:InfiniBand(IB)、RoCE(RDMA over Converged Ethernet,融合以太网上的RDMA)和iWARP(Internet Wide Area RDMA Protocol,互联网广域RDMA协议)。理解三者的原理与差异,掌握RDMA的基本操作类型,并深入认识其拥塞控制与流控机制,是构建高性能NVMe over RDMA存储网络的基石。本章将逐一拆解这些核心技术点,并结合实际部署场景给出判断依据与实战建议。
3.1 三种RDMA协议栈的原理与差异
3.1.1 核心原理
RDMA的本质是允许网卡(HCA或RNIC)直接访问应用程序内存,绕过内核。三种协议在实现这一目标时,选择了不同的传输路径:
- InfiniBand:从零设计的专用网络。拥有独立的链路层、网络层和传输层,通过子网管理器(SM)管理拓扑。其物理层采用高速串行链路,天然提供无损传输和基于信用的流控机制,是最纯粹的RDMA实现。
- RoCE:将RDMA语义封装在以太网帧中。RoCE v1工作在二层(以太网类型0x8915),要求收发双方在同一VLAN内;RoCE v2则将其封装在UDP/IP中(目标端口4791),实现了三层路由能力,但依赖以太网的无损特性(需PFC、ECN等机制配合)。
- iWARP:将RDMA语义映射到TCP/IP协议栈上。利用TCP的可靠传输和拥塞控制,兼容性最好,但TCP协议栈的处理开销较大,且延迟相对较高。
3.1.2 判断方法:如何选择协议
在实际存储网络设计中,选择哪种协议取决于现有基础设施、性能需求和预算约束。以下判断流程可供参考:
- 是否新建网络? 如果是新建专用存储网络且预算充足,优先考虑InfiniBand,其性能与稳定性最佳。
- 是否复用现有以太网? 如果必须复用万兆/25G/100G以太网,则选择RoCE v2(支持路由)或RoCE v1(仅二层)。
- 是否需要跨三层/广域网? 若涉及跨数据中心或复杂路由,iWARP的TCP兼容性优势明显,但需接受性能折损。
- 检查网卡支持:确认服务器网卡型号是否支持RoCE或iWARP,以及驱动版本是否支持DCQCN等高级特性。
| 对比维度 | InfiniBand | RoCE v1 | RoCE v2 | iWARP |
|---|---|---|---|---|
| 传输层 | 专用IB传输层 | 以太网二层 | UDP/IP | TCP/IP |
| 无损保障 | 原生基于信用流控 | 需PFC | 需PFC+ECN | TCP重传 |
| 延迟 | 极低(亚微秒) | 低 | 低 | 较高 |
| CPU开销 | 极低 | 低 | 低 | 中高 |
| 路由支持 | 是 | 否 | 是 | 是 |
| 成本 | 高 | 中(复用以太网) | 中 | |
3.1.3 常见误区
- 误区一:RoCE v2不需要无损网络。 实际上,RoCE v2依赖底层以太网不丢包,否则RDMA重传机制会严重降低性能。
- 误区二:iWARP性能与RoCE相当。 由于TCP/IP协议栈处理开销,iWARP的CPU占用率通常更高,延迟也更高。
- 误区三:InfiniBand无法与以太网互通。 通过网关或双端口网卡可以实现IB与以太网的桥接,但会引入额外延迟。
3.2 RDMA操作类型:Send/Recv与RDMA Read/Write
3.2.1 核心原理
RDMA操作分为两类:双边操作(Send/Recv)和单边操作(RDMA Read/Write)。
- Send/Recv:类似传统消息传递。发送方调用Send,接收方必须预先投递Recv请求(即准备好接收缓冲区)。双方CPU都参与操作,适合控制消息或短数据传输。
- RDMA Read/Write:单边操作。发起方直接指定远端内存地址和长度,网卡直接读写远端内存,远端CPU完全无感知。适合批量数据传输,如NVMe读写命令的数据搬移。
3.2.2 操作流程与代码示例
以RDMA Write为例,典型流程如下:
- 建立QP(Queue Pair)连接,并完成内存注册(Memory Registration)。
- 发起方准备本地缓冲区,填充数据。
- 调用
ibv_post_send,指定WR(Work Request)类型为IBV_WR_RDMA_WRITE,并填入远端虚拟地址和RKey。 - 网卡硬件直接读取本地内存,并通过RDMA协议写入远端内存。
- 完成通知(Completion)通过CQ(Completion Queue)返回。
struct ibv_send_wr wr;
struct ibv_sge sge;
memset(&wr, 0, sizeof(wr));
wr.opcode = IBV_WR_RDMA_WRITE;
wr.sg_list = &sge;
wr.num_sge = 1;
wr.wr.rdma.remote_addr = (uint64_t)remote_buf;
wr.wr.rdma.rkey = remote_rkey;
sge.addr = (uint64_t)local_buf;
sge.length = data_len;
sge.lkey = local_lkey;
ibv_post_send(qp, &wr, &bad_wr);
3.2.3 案例拆解:NVMe over RDMA中的操作选择
在NVMe over RDMA存储系统中,命令与数据分离是关键设计。通常,NVMe命令(如读/写命令)使用Send/Recv传输,因为命令短且需要接收方确认;而数据块则使用RDMA Read/Write直接搬移。例如,主机发送读命令后,存储控制器通过RDMA Write将数据直接写入主机预先注册的内存缓冲区,无需主机CPU介入。
| 操作类型 | 适用场景 | CPU参与 | 延迟 |
|---|---|---|---|
| Send/Recv | 命令、控制消息、小数据 | 双方均参与 | 较高 |
| RDMA Read | 拉取数据(如读操作) | 仅发起方 | 低 |
| RDMA Write | 推送数据(如写操作) | 仅发起方 | 低 |
3.3 拥塞控制与流控机制
3.3.1 核心原理
流控(Flow Control)解决的是“发送速率不超过接收能力”的问题,防止接收端缓冲区溢出;拥塞控制(Congestion Control)解决的是“网络中间节点(交换机)缓存溢出”的问题,防止丢包。RDMA对丢包极其敏感,因为重传代价高昂。
- InfiniBand流控:基于信用(Credit)的链路层流控。接收方通告可用信用,发送方只有获得信用才能发送数据,从机制上杜绝了丢包。
- RoCE流控:依赖以太网PFC(Priority Flow Control,优先级流控)。PFC在交换机端口上为特定优先级队列提供暂停帧,防止缓冲区溢出。拥塞控制则依赖ECN(Explicit Congestion Notification,显式拥塞通知)和DCQCN(Data Center Quantized Congestion Notification)算法。
- iWARP拥塞控制:直接复用TCP的拥塞控制算法(如CUBIC),但TCP的慢启动和线性增长在数据中心环境下可能过于保守。
3.3.2 判断方法与调优步骤
当RoCE网络出现性能下降时,可按以下步骤排查:
- 检查丢包:使用
ethtool -S查看网卡丢包计数,或交换机上查看PFC暂停帧计数。 - 确认PFC配置:确保交换机与网卡的PFC优先级一致(通常为3或4),且未与普通TCP流量混用。
- 启用ECN:在交换机和网卡上启用ECN,并配置DCQCN参数(如
g、rate reduce等)。 - 调整限速:使用
mlnx_qos或tc工具设置流量整形,限制突发流量。
# 查看RoCE网卡PFC统计
ethtool -S enp175s0 | grep -i pfc
# 启用DCQCN(Mellanox网卡示例)
echo 1 > /sys/class/infiniband/mlx5_0/ports/1/counters/ecn_marked
3.3.3 案例拆解:一次RoCE网络拥塞排障
背景:某数据中心部署了100G RoCE v2网络承载NVMe over RDMA存储流量,业务高峰时出现存储延迟抖动,从50μs飙升至2ms。
排查过程:
- 通过监控发现交换机端口丢弃计数持续增长,且PFC暂停帧频繁发出。
- 检查PFC配置,发现存储流量与备份流量共用同一优先级队列,备份流量突发导致存储流量被暂停。
- 进一步分析,发现ECN标记未生效,网卡驱动未加载DCQCN模块。
解决方案:
- 将存储流量映射到独立优先级队列(如优先级3),并启用PFC。
- 在交换机和网卡上启用ECN,并加载DCQCN配置。
- 设置网卡限速为80Gbps,预留带宽余量。
结果:延迟恢复至60μs左右,丢包归零,PFC暂停帧减少90%。
3.3.4 常见误区
- 误区一:PFC可以解决所有拥塞问题。 PFC只能防止缓冲区溢出,但可能引发“队头阻塞”和死锁,需配合ECN使用。
- 误区二:拥塞控制只与交换机有关。 网卡侧的参数(如限速、ECN响应)同样关键。
- 误区三:iWARP无需额外配置。 虽然TCP自带拥塞控制,但在高并发下TCP重传仍会严重影响性能,需调整TCP缓冲区大小。
综上所述,RDMA技术栈的选择与调优需要系统性地考虑协议特性、硬件能力与网络架构。在实际部署中,建议先进行小规模验证,通过监控工具(如perftest、ibstat)量化延迟与吞吐,再逐步扩大规模。理解Send/Recv与RDMA Read/Write的适用边界,以及流控与拥塞控制的协同机制,是构建稳定、高性能NVMe over RDMA存储网络的关键。