RDMA基础:工作原理、InfiniBand与RoCEv2对比及关键概念
核心原理:内核旁路与数据直通
RDMA(Remote Direct Memory Access)的核心思想是让网卡硬件直接与应用程序内存交换数据,绕过操作系统内核的参与。传统网络路径中,数据需经过内核协议栈、Socket缓冲区、上下文切换等环节,而RDMA通过网卡上的专用硬件(如DMA引擎和传输引擎)完成数据搬运,使应用能够以极低的CPU占用率获得微秒级延迟。
RDMA的三大核心机制可概括为:
- 内核旁路(Kernel Bypass):应用通过用户态驱动直接访问网卡硬件队列,避免系统调用和中断开销。
- 数据直通(Zero-Copy):数据在网卡与用户缓冲区之间直接DMA传输,无需在内核内存与应用内存之间复制。
- 卸载处理(Offload):消息的可靠传输、乱序重组、流量控制等由网卡硬件完成,而非CPU软件处理。
下图展示了RDMA与传统TCP/IP协议栈在数据路径上的本质差异:
从图中可以清晰看到,RDMA路径中没有内核协议栈参与,应用通过用户态驱动直接操作网卡上的硬件队列,数据在网卡与应用缓冲区之间直接DMA搬运。这种设计消除了传统网络中最耗时的三部分:内核协议栈处理、数据拷贝、上下文切换。
InfiniBand与RoCEv2对比
RDMA技术有多个实现载体,目前生产环境中最常见的是InfiniBand(IB)和RoCEv2(RDMA over Converged Ethernet version 2)。两者在物理层、网络层和生态上存在显著差异,直接影响延迟表现和部署方式。
| 对比维度 | InfiniBand | RoCEv2 |
|---|---|---|
| 物理层 | 专用IB链路(QDR/HDR/NDR),无损传输 | 标准以太网(25/100/200GbE),需PFC保证无损 |
| 网络层 | IB自有网络层(L3),无IP路由 | 基于UDP/IP(IPv4/IPv6),可路由 |
| 端到端延迟 | 最低(约0.5~1μs) | 略高(约1~3μs),受交换机缓冲影响 |
| 拥塞控制 | IB CC(自研机制) | DCQCN(基于ECN) |
| 部署成本 | 专用交换机+线缆,成本高 | 复用现有以太网,成本较低 |
| 生态兼容 | 需专用驱动(mlx5_ib) | 支持标准以太网交换机 |
关键概念:QP、CQ、MR
理解RDMA必须掌握三个核心抽象对象,它们是RDMA通信的基本构件,也是后续排查延迟问题时的关键切入点。
1. QP(Queue Pair,队列对)
QP是RDMA通信的基本端点,由发送队列(SQ)和接收队列(RQ)组成。应用通过向SQ提交工作请求(WR)来发起发送或RDMA读写操作,对端通过RQ接收消息。QP的状态机包括RESET、INIT、RTR(Ready to Receive)、RTS(Ready to Send)等状态,任何状态异常都可能导致通信中断或延迟飙升。
2. CQ(Completion Queue,完成队列)
CQ用于通知应用异步操作已完成。当SQ中的发送请求或RQ中的接收请求完成后,网卡会向CQ写入完成队列元素(CQE)。应用通过轮询CQ获取完成通知。CQ的设计直接影响延迟——轮询间隔、CQ深度设置不当都会引入额外延迟。
3. MR(Memory Region,内存区域)
MR是应用注册给网卡硬件访问的内存区域。注册时需指定内存地址、长度和访问权限(本地读/写、远程读/写等)。网卡通过MR的L_Key(本地键)和R_Key(远程键)来验证访问合法性。MR的注册方式(如使用ibv_reg_mr)和内存钉扎(Memory Pinning)策略会影响DMA效率和延迟。
// 典型QP创建流程(伪代码)
struct ibv_pd *pd = ibv_alloc_pd(context);
struct ibv_mr *mr = ibv_reg_mr(pd, buffer, size,
IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE);
struct ibv_cq *cq = ibv_create_cq(context, cq_depth, NULL, NULL, 0);
struct ibv_qp_init_attr attr = {
.send_cq = cq,
.recv_cq = cq,
.qp_type = IBV_QPT_RC, // 可靠连接
.cap = { .max_send_wr = 128, .max_recv_wr = 128 }
};
struct ibv_qp *qp = ibv_create_qp(pd, &attr);
案例场景:一次RDMA读操作的完整流程
以远程内存读取(RDMA Read)为例,串联上述概念,展示一次典型操作的完整路径:
- 准备阶段:节点A注册MR(内存区域),获取本地L_Key;节点B也注册MR,并将自己的R_Key和内存地址通过带外通道(如TCP)告知节点A。
- 连接建立:节点A创建QP并切换到RTS状态,节点B同样创建QP并建立连接(RC类型)。
- 提交WR:节点A在SQ中提交一个RDMA Read工作请求,指定对端节点B的虚拟地址、R_Key、本地缓冲区地址和长度。
- 硬件执行:节点A的网卡硬件解析WR,直接通过IB/RoCE网络向节点B发送读请求;节点B网卡验证R_Key后,从指定内存地址读取数据,直接DMA写回节点A的本地缓冲区。
- 完成通知:节点A网卡向CQ写入CQE,应用轮询到CQE后确认操作完成。
整个过程无需节点B的CPU参与,也无需任何内核系统调用。延迟主要消耗在:网卡硬件处理时间(约几百纳秒)、链路传输时间(取决于距离和交换机跳数)、以及CQ轮询的响应时间。
误区与复盘:延迟排查中的常见盲区
复盘建议:当RDMA延迟异常时,首先通过ibv_devinfo检查设备状态,用perftest(如ib_read_lat)测量基线延迟,再逐层排查QP状态、CQ深度、MR注册方式、网络拥塞指标(PFC/ECN)。将硬件基线延迟与实测延迟对比,能快速定位问题是在网卡驱动层、协议栈层还是网络链路层。