当前位置: 首页 > news >正文

RDMA 与RoCE v2

一套最精简、能直接落地的 RDMA / RoCE v2 工程资料包,包含:关系再梳理、报文结构、FPGA 实现框架、x86 侧最简可用 C 代码、测试命令。

一、RDMA ↔ RoCE v2 关系(最终版)

  • RDMA:一套远程直接内存访问技术标准(API + 语义)
    • 零拷贝、内核旁路、CPU 不参与数据搬运
  • RoCE:RDMA over Converged Ethernet,以太网承载 RDMA
    • RoCE v1:L2 以太网,不可路由
    • RoCE v2:L3 UDP/IP 封装,可路由,现在唯一实用版本

可以记成:

RDMA = 能力RoCE v2 = 以太网环境下跑 RDMA 的报文格式


二、RoCE v2 报文封装结构

plaintext

以太网头 + IP头 + UDP头 + GRH + BTH + RDE + 载荷
  • GRH:Global Routing Header(RoCE v2 特有,用于路由)
  • BTH:Base Transport Header
  • RDE:RDMA 扩展头(Send/Read/Write/Atomic)

特点:

  • 就是一个标准 UDP 报文,端口默认4791
  • 普通交换机可转发,支持三层路由
  • 无损网络建议开启PFC / ECN(不强制,但延迟更稳)

三、FPGA 实现 RoCE v2 最小结构

你用 FPGA 做 RNIC(RDMA 网卡),核心就这几部分:

  1. PCIe DMA 引擎
    • 与 x86 主机内存交互(QP 队列、WQE、CQE)
  2. QP 管理模块(Queue Pair)
    • SQ + RQ:发送 / 接收队列
    • CQ:完成队列
  3. RoCE v2 协议栈
    • 封装 / 解封装 GRH/BTH/UDP/IP
    • 校验和卸载
  4. 以太网 MAC/PCS
    • 25G/100G 以太网时序处理
  5. 可靠传输控制(可选)
    • ACK、重传、滑动窗口(RC 模式)

数据流:

plaintext

x86 提交 WQE → FPGA QP → 封装 RoCE v2 → 以太网发送

四、x86 侧 RDMA (ibverbs) 最简发送代码

依赖:libibverbs

c

运行

#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 通信最常用)

  1. IBV_WR_SEND
    • 主动发消息,对方需提前 posted recv
  2. IBV_WR_WRITE
    • 直接写对方内存,对方 CPU 完全无感知
    • 最适合 FPGA → x86 低延迟上行
  3. IBV_WR_READ
    • 直接读对方内存
  4. Atomic
    • 原子加 / 比较交换,用于同步

实时通信首选:WRITE + 少量 SEND 同步


六、测试 RDMA 延迟 / 带宽命令

安装:perftest

bash

运行

# 服务端(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 左右
  • 抖动:< 100ns
  • 100G 带宽可跑满

七、你接下来最该做的三件事

  1. 在 FPGA 上实现RoCE v2 + QP + DMA
  2. x86 用ibverbsRDMA_WRITE上行
  3. 配合之前的系统优化(isolcpus、关闭节能、巨页)
http://www.jsqmd.com/news/535137/

相关文章:

  • Crowbar:赋能创作者的开源游戏开发效率工具
  • 嵌入式硬件脉冲计数器:高精度零丢脉冲实现原理与跨平台实践
  • MinIO桶里文件太多,list_objects卡死?试试这个‘目录管家’方案(附SpringBoot代码)
  • Java 字符串三剑客:String、StringBuilder 与 StringBuffer 深度解析与选型指南
  • 管道导波检测进阶:如何用Comsol优化裂纹识别精度(含最新信号处理方法)
  • 2026-03-25 闲话
  • 超越基础:用rqt_plot+Python脚本实现ROS传感器数据持久化分析
  • C++与SolidWorks二次开发实战:从零绘制基础几何体
  • QoS实战:从原理到企业网络优化配置
  • 手把手教你设计反相输入有源低通滤波器(附Multisim仿真文件)
  • DNSlog花式玩法:从SQL注入到XXE漏洞的7种实战检测技巧
  • mdnice vs 原生编辑器:3个提升微信公众号排版效率的隐藏技巧
  • GLM-4-9B模型服务网格化:Istio集成实战
  • Android 集成第三方地图App的轻量级解决方案(高德、百度及网页版)
  • Qwen3.5-4B-Claude-Opus-GGUF行业应用:新能源电池BMS故障预测逻辑链
  • 单调队列优化多重背包 详解学习笔记
  • Llama-3.2V-11B-cot实战教程:Streamlit界面响应延迟优化与调试
  • 手把手教你用JavaScript实现炉石酒馆战棋战斗模拟器(附GitHub源码)
  • 关于生成器中yield“怪异”用法的理解
  • 从堆叠注入到系统提权:一次BC站点的完整渗透测试剖析
  • 5个实用方法解决Armbian系统版本管理难题:从识别到升级的完整指南
  • OpenCore Legacy Patcher终极指南:从故障排除到高级配置优化
  • yuzu模拟器终极性能优化:突破帧率限制的完整指南
  • 从COCO到你的业务:如何为自定义数据集定义‘小目标’?聊聊mAP_s背后的评估陷阱与调优实战
  • 嵌入式工程师必看:如何用查表法在无FPU的MCU上快速计算log10
  • 2026.3.25
  • Wan2.2-I2V-A14B部署教程:Windows WSL2环境下RTX4090D驱动适配方案
  • 边缘AI语音交互平台:xiaozhi-esp32开源项目深度解析
  • SDMatte镜像国产化适配:昇腾/海光平台移植可行性评估
  • S2-Pro Java开发实战:集成JDK1.8与SpringBoot的微服务智能日志分析