RDMA 与RoCE v2 一套最精简、能直接落地的 RDMA / RoCE v2 工程资料包包含关系再梳理、报文结构、FPGA 实现框架、x86 侧最简可用 C 代码、测试命令。一、RDMA ↔ RoCE v2 关系最终版RDMA一套远程直接内存访问技术标准API 语义零拷贝、内核旁路、CPU 不参与数据搬运RoCERDMA over Converged Ethernet以太网承载 RDMARoCE v1L2 以太网不可路由RoCE v2L3 UDP/IP 封装可路由现在唯一实用版本可以记成RDMA 能力RoCE v2 以太网环境下跑 RDMA 的报文格式二、RoCE v2 报文封装结构plaintext以太网头 IP头 UDP头 GRH BTH RDE 载荷GRHGlobal Routing HeaderRoCE v2 特有用于路由BTHBase Transport HeaderRDERDMA 扩展头Send/Read/Write/Atomic特点就是一个标准 UDP 报文端口默认4791普通交换机可转发支持三层路由无损网络建议开启PFC / ECN不强制但延迟更稳三、FPGA 实现 RoCE v2 最小结构你用 FPGA 做 RNICRDMA 网卡核心就这几部分PCIe DMA 引擎与 x86 主机内存交互QP 队列、WQE、CQEQP 管理模块Queue PairSQ RQ发送 / 接收队列CQ完成队列RoCE v2 协议栈封装 / 解封装 GRH/BTH/UDP/IP校验和卸载以太网 MAC/PCS25G/100G 以太网时序处理可靠传输控制可选ACK、重传、滑动窗口RC 模式数据流plaintextx86 提交 WQE → FPGA QP → 封装 RoCE v2 → 以太网发送四、x86 侧 RDMA (ibverbs) 最简发送代码依赖libibverbsc运行#include infiniband/verbs.h #include stdio.h #include stdlib.h #include string.h #define BUF_SIZE 1024 int main() { struct ibv_device **dev_list; struct ibv_context *ctx; struct ibv_pd *pd; struct ibv_mr *mr; struct ibv_cq *cq; struct ibv_qp *qp; struct ibv_qp_init_attr qp_attr {}; char *buf malloc(BUF_SIZE); struct ibv_wc wc; int ret; // 1. 打开 RDMA 设备 dev_list ibv_get_device_list(NULL); ctx ibv_open_device(dev_list[0]); ibv_free_device_list(dev_list); // 2. 保护域 注册内存 pd ibv_alloc_pd(ctx); mr ibv_reg_mr(pd, buf, BUF_SIZE, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE); // 3. 创建 CQ QP cq ibv_create_cq(ctx, 128, NULL, NULL, 0); qp_attr.send_cq cq; qp_attr.recv_cq cq; qp_attr.qp_type IBV_QPT_RC; // RC 可靠连接 qp ibv_create_qp(pd, qp_attr); // 4. QP 状态切换 (INIT-RTR-RTS) // 略需要对方 QP 信息实际代码需交换 GID/QP 号 // 5. 发送数据 memset(buf, 0x5a, BUF_SIZE); struct ibv_sge sge { .addr (uint64_t)buf, .length BUF_SIZE, .lkey mr-lkey }; struct ibv_send_wr wr { .wr_id 0x1234, .sg_list sge, .num_sge 1, .opcode IBV_WR_SEND, .send_flags IBV_SEND_SIGNALED }; struct ibv_send_wr *bad_wr; ret ibv_post_send(qp, wr, bad_wr); // 6. 等待完成 while (ibv_poll_cq(cq, 1, wc) 1); printf(RDMA Send 完成, status%d\n, wc.status); return 0; }编译bash运行gcc rdma_test.c -o rdma_test -libverbs五、RDMA 常用操作你和 FPGA 通信最常用IBV_WR_SEND主动发消息对方需提前 posted recvIBV_WR_WRITE直接写对方内存对方 CPU 完全无感知最适合 FPGA → x86 低延迟上行IBV_WR_READ直接读对方内存Atomic原子加 / 比较交换用于同步实时通信首选WRITE 少量 SEND 同步六、测试 RDMA 延迟 / 带宽命令安装perftestbash运行# 服务端FPGA 或另一台机器 ib_write_bw -d rdma0 -R # RoCE v2 ib_write_lat -d rdma0 -R # 客户端 ib_write_bw -d rdma0 -R 192.168.1.100 ib_write_lat -d rdma0 -R 192.168.1.100典型结果写延迟1us 左右抖动 100ns100G 带宽可跑满七、你接下来最该做的三件事在 FPGA 上实现RoCE v2 QP DMAx86 用ibverbs跑RDMA_WRITE上行配合之前的系统优化isolcpus、关闭节能、巨页