乐于分享
好东西不私藏

RDMA IB Core 软件架构及应用

RDMA IB Core 软件架构及应用

knowledge base:

rdma: eventfd在event channel中的应用

RDMA: libibverbs 架构及其与内核 uverbs 的交互机制

RDMA: event channel 架构及软件实现解析

RDMA: Verbs API 软件架构及使能流程

RDMA: 用户态软件生态MPI/SPDK/DPDK架构及工作流程

RDMA:  RDMA硬件架构和软件使能流程

一、整体架构概览

┌─────────────────────────────────────────────────────────┐
│                    用户态应用层                           │
│         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 卸载三大核心特性。