RDMA技术

yuanheci 2025年06月07日 9次浏览

概述

基本原理

  RDMA的基本原理是,通过硬件(如RDMA网卡)直接在应用程序的内存之间搬移数据,绕过了操作系统的网络协议栈,从而避免了数据在用户空间和内核空间之间多次拷贝的开销,以及上下文切换的开销。RDMA操作可以看作是硬件执行的远程内存读写操作,因此具有非常高的性能。

主要特点

  • 零拷贝:RDMA可以直接将数据从发送方的内存传输到接收方的内存,无需在内核和用户空间之间进行数据拷贝。
  • 低延迟:由于绕过了操作系统的网络协议栈,RDMA可以实现微秒级的低延迟通信。
  • 高带宽利用率:RDMA可以有效地利用网络的带宽,提高数据传输的效率。
  • CPU卸载:RDMA操作大部分由硬件完成,大大减轻了CPU的负担。

不使用RDMA:
image-1749264817516

RDMA技术:
image-1749264837617


RDMA技术梳理

https://xie.infoq.cn/article/7c6215a96268fd49ea2c06c0c

会议报告:https://www.meemx.com/p/everything-about-rdma/


RDMA与RDMA网卡

RDMA 网卡是技术落地的硬件基石

  RDMA 技术的优势(低延迟、高带宽、省 CPU)必须依赖具备特殊功能的网卡硬件才能实现。普通网卡因缺乏协议卸载引擎、内存直接访问能力和低延迟队列管理机制,无法支撑 RDMA 的核心特性。因此,RDMA 网卡本质上是为 RDMA 技术量身定制的专用硬件,是其从理论走向实际应用的必要载体。


Linux中RDMA子系统

  ib_core驱动 是 Linux 内核中 RDMA(Remote Direct Memory Access)子系统的核心框架,由Linux 社区主导开发,主要贡献者包括OpenFabrics 联盟成员(如 Mellanox、Intel、Oracle 等)。它的设计初衷是为不同厂商的 RDMA 设备(如 InfiniBand、RoCE、iWARP)提供统一的内核抽象层。

ib_core 采用分层架构,与硬件驱动、用户空间应用协同工作:

  1. 硬件抽象层
    设备驱动:如 mlx5_ib(Mellanox 网卡)、i40iw(Intel 网卡),负责与物理设备通信。
    ib_core:提供统一的设备注册接口,屏蔽硬件差异。
  2. 核心功能层
    内存管理:实现 MR(Memory Region)注册、键值(Key)分配。
    队列管理:创建和维护发送队列(SQ)、接收队列(RQ)和完成队列(CQ)。
    传输管理:处理 RDMA 操作(Send/Recv、Read/Write、Atomic)的路由和调度。
  3. 用户空间接口
    Verbs API:通过 /dev/infiniband/uverbsN 提供,用户空间库(如 libibverbs)可调用。
    sysfs 接口:通过 /sys/class/infiniband/ 暴露设备信息和统计数据。
    三、关键组件与数据结构
  4. 核心数据结构
    ib_device:表示一个 RDMA 设备,包含硬件能力和操作函数集。
    ib_pd(Protection Domain):隔离内存访问权限的安全上下文。
    ib_mr(Memory Region):注册的内存区域,用于远程直接访问。
    ib_qp(Queue Pair):发送队列(SQ)和接收队列(RQ)的组合,是通信的基本单元。
  5. 关键模块
    ib_core:核心框架,提供基础数据结构和操作函数。
    ib_uverbs:用户空间 verbs 接口实现。
    ib_ucm:用户空间完成事件通知机制。
    四、与其他驱动的关系
    ib_core 作为基础框架,依赖具体硬件驱动实现功能:
用户空间应用 (librdmacm, libibverbs)
    ↓
内核空间接口 (ib_uverbs)
    ↓
ib_core (核心框架)
    ↓
硬件驱动层
┌───────────┬───────────┬───────────┐
│ mlx5_ib   │ i40iw     │ 其他厂商驱动 │
└───────────┴───────────┴───────────┘
    ↓
物理设备 (Mellanox网卡、Intel网卡等)

例如,Mellanox 网卡需要同时加载:
mlnx5_core(基础驱动)
mlnx5_ib(InfiniBand/RoCE 功能,依赖 ib_core)