RDMA IB Core 软件架构及应用
knowledge base:
rdma: eventfd在event channel中的应用
RDMA: libibverbs 架构及其与内核 uverbs 的交互机制
RDMA: 用户态软件生态MPI/SPDK/DPDK架构及工作流程
一、整体架构概览
┌─────────────────────────────────────────────────────────┐
│ 用户态应用层 │
│ MPI / NCCL / Databases / Storage Apps │
├─────────────────────────────────────────────────────────┤
│ 用户态库 (libibverbs) │
│ rdma-core / libibverbs / librdmacm │
├─────────────────────────────────────────────────────────┤
│ 系统调用界面 │
│ ioctl / mmap / read / write │
├──────────────────┬──────────────────┬───────────────────┤
│ IB Verbs 层 │ RDMA CM 层 │ MAD 层 │
│ (ib_uverbs) │ (rdma_cm) │ (ib_umad) │
├──────────────────┴──────────────────┴───────────────────┤
│ IB Core 核心层 │
│ (ib_core / rdma_core) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐ │
│ │ 设备管理 │ │ QP管理 │ │ MR管理 │ │ 事件管理 │ │
│ └──────────┘ └──────────┘ └──────────┘ └───────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐ │
│ │ GID管理 │ │ PD管理 │ │ CQ管理 │ │ 路由/SA │ │
│ └──────────┘ └──────────┘ └──────────┘ └───────────┘ │
├──────────────────────────────────────────────────────────┤
│ 低级驱动抽象层 │
│ (ib_core ops / verbs ops) │
├───────────────┬──────────────┬───────────────────────────┤
│ Mellanox │ Intel OPA │ RoCE (软件驱动) │
│ mlx4/mlx5 │ hfi1 │ rxe / siw │
└───────────────┴──────────────┴───────────────────────────┘
二、IB Core 核心模块详解
arch detail

1. 设备管理 (Device Management)
ib_core 维护全局设备链表
│
├── ib_register_device() ← 驱动调用注册
├── ib_unregister_device() ← 驱动卸载注销
├── ib_device 结构体 ← 设备抽象
│ ├── ops (verbs函数表)
│ ├── port_data[]
│ ├── attrs (设备属性)
│ └── gid_table
└── ib_client 注册机制 ← 上层模块监听设备事件
关键数据结构:
struct ib_device {
struct device dev;
struct ib_device_ops ops; // verbs操作函数指针表
char name[IB_DEVICE_NAME_MAX];
struct rdma_hw_stats *hw_stats;
struct ib_port_data *port_data;
u32 phys_port_cnt;
// GID表、缓存、事件处理...
};
2. 核心对象模型
PD (Protection Domain)
│
├── MR (Memory Region) ← 注册内存,获取 lkey/rkey
│ └── 物理页表映射 → DMA地址
│
├── QP (Queue Pair) ← 核心通信端点
│ ├── SQ (Send Queue)
│ ├── RQ (Receive Queue)
│ ├── send_cq → CQ
│ └── recv_cq → CQ
│
├── SRQ (Shared Receive Queue)
│
└── MW (Memory Window)
QP 状态机:
RESET → INIT → RTR (Ready to Receive)
→ RTS (Ready to Send) ← 正常工作状态
→ SQD → SQE → ERROR
3. 传输类型
| 类型 | 全称 | 特点 | 典型用途 |
|---|---|---|---|
| RC | Reliable Connected | 可靠、有序、点对点 | 存储、数据库 |
| UC | Unreliable Connected | 不可靠,低延迟 | 较少使用 |
| UD | Unreliable Datagram | 多播支持,1:N | 心跳、发现 |
| XRC | Extended RC | 跨进程共享 RQ | 大规模集群 |
| DC | Dynamic Connected | Mellanox 专有 | 超大规模 |
4. 内存注册子系统
用户调用 ibv_reg_mr()
│
▼
ib_core → ib_reg_user_mr()
│
├── 调用 get_user_pages() 锁定物理页
├── dma_map_sg() 建立DMA映射
├── 驱动写入 HW 页表 (MTT/MPT)
└── 返回 lkey (本地) / rkey (远端)
RDMA操作时:
硬件直接通过 rkey 验证 + 地址转换
→ 绕过 CPU 直接 DMA 读写内存
5. 完成队列 (CQ) 与事件机制
硬件完成 WQE
│
▼
CQ Ring Buffer (共享内存)
│
├── 轮询模式:ibv_poll_cq() ← 低延迟,高CPU
└── 事件模式:ibv_req_notify_cq() ← 低CPU,略高延迟
│
▼
Completion Channel (fd)
│
epoll/read
三、关键子系统
RDMA CM (连接管理)
服务端 客户端
rdma_create_id() rdma_create_id()
rdma_bind_addr() │
rdma_listen() rdma_resolve_addr()
│ rdma_resolve_route()
│ ←── CM REQ ────── rdma_connect()
rdma_accept()
│ ───── CM REP ────→
│ RDMA_CM_EVENT_ESTABLISHED
RDMA_CM_EVENT_ESTABLISHED
数据传输阶段 (RC QP)
MAD 子系统 (管理数据报)
ib_mad 模块
├── SM (Subnet Manager) 通信 ← OpenSM
├── SA (Subnet Administration) ← 路径查询
├── PMA (性能管理)
└── 通过 QP0/QP1 传输
四、数据路径对比
Send/Recv (双边操作)
发送方 post_send(WR) 接收方 post_recv(WR)
→ 硬件读取WR → 硬件放置数据
→ DMA读本地内存 网络 → 触发Recv完成
→ 发包 ──────────→ → ibv_poll_cq()
RDMA Read/Write (单边操作)
发起方 post_send(RDMA_WRITE/READ)
→ 携带对端 rkey + 虚拟地址
→ 硬件直接操作对端内存
→ 对端 CPU 完全无感知 ← 核心优势
→ 仅发起方产生完成事件
五、典型应用场景
1. HPC / AI 训练 (NCCL + RDMA)
GPU0 ──→ GPU Memory ──→ RDMA MR 注册
│ ibv_post_send (RDMA_WRITE)
GPU1 ←── GPU Memory ←── 直接写入 ← 零拷贝 AllReduce
2. 分布式存储 (NVMe-oF / Ceph)
客户端 存储节点
NVMe-oF initiator →RDMA→ NVMe-oF target
ibv_post_send spdk/kernel target
(RDMA READ 读磁盘数据) 直接 DMA 到客户端内存
3. DPDK + RDMA 融合
网络包处理 (DPDK) + 存储/计算 (RDMA verbs)
共享 HCA 硬件资源,统一内存池
六、性能关键路径优化

| 优化点 | 技术手段 |
|---|---|
| 延迟 | Doorbell batching、Inline data (≤64B 免 DMA) |
| 吞吐 | Multi-packet RQ、Striding RQ |
| CPU 卸载 | ODPR (On-Demand Paging)、ODP |
| 扩展性 | SRQ 共享、XRC 跨进程、DC 动态连接 |
| 内存 | Huge Page 注册、MR 缓存复用 |
七、内核模块依赖关系
rdma_rxe / mlx5_ib / hfi1
↓ 依赖
ib_core (核心注册/对象管理)
ib_uverbs (用户态接口)
rdma_cm (连接管理)
ib_mad (管理报文)
↓
libibverbs (用户态库)
↓
应用程序 / MPI / NCCL
IB Core 的设计精髓在于:将硬件无关的对象模型(QP/CQ/MR/PD)与驱动无关的 verbs 接口标准化,使上层应用可以无缝运行在 InfiniBand、RoCE、iWARP 等不同传输介质之上,同时通过单边 RDMA 操作实现真正的零拷贝、内核旁路、CPU 卸载三大核心特性。


夜雨聆风