RDMA学习2:memory window in rdma
MR Window(Memory Window,MW,内存窗口) 是 RDMA 里绑定在 MR 上的、可动态授权/回收的细粒度访问控制对象,用来解决”大 MR、多租户、动态权限”问题。可以理解成:MR 是整片内存,MW 是从 MR 里切出来的、能单独控制权限的小窗口。
0.1. 一、MR 与 MW 的关系
0.1.1. MR(Memory Region,内存区域)
- 把一段内存注册给 RNIC(远程直接内存访问网卡),pin 住内存、禁止换页,由硬件维护内存地址映射关系。
- 一个 MR 对应一套固定权限(本地访问、远程读、远程写、原子操作等),以及一个唯一的 rkey(远程访问凭证)。
- 核心问题:MR 粒度较粗,rkey 固定不变,若需修改访问权限,必须重新注册 MR,操作开销较大。
0.1.2. MW(Memory Window,内存窗口)
- 必须绑定到一个已存在的 MR,本质是 MR 的子集,包含指定的地址区间和独立的访问权限。
- 一个 MR 可以绑定多个 MW,每个 MW 拥有自己独立的起始地址、内存长度、访问权限和 rkey。
- 核心价值:无需重新注册 MR,即可实现权限动态调整、rkey 动态作废,大幅降低操作开销。
0.2. 二、MW 的两种类型(IB 规范定义,MLX 适配说明)
0.2.1. 1. Type 1 MW(传统类型,硬件管理 rkey)
- 绑定方式:通过
ibv_bind_mw接口,将 MW 绑定到指定的 MR 和 QP(队列对),rkey 由硬件或驱动自动分配。 - 生命周期:与绑定的 QP 绑定,QP 销毁时,MW 自动失效;无法单独使 rkey 作废。
- 适用场景:访问场景固定、QP 生命周期较长、权限变更频率低的场景。
- MLX 说明:MLX 官方不主推该类型,性能和灵活性不如 Type2,生产环境建议优先使用 Type2 MW。
0.2.2. 2. Type 2 MW(动态类型,用户控制 rkey,MLX 推荐)
- 绑定方式:MLX 标准用法为直接构造 BIND_MW WR(无
ibv_bind_mw封装函数),绑定到 MR,rkey 可由用户自定义指定(如随机生成,提升安全性)。 - 生命周期:可通过构造 INVALIDATE_MW WR 单独作废 rkey,不影响绑定的 MR 和 QP;作废后可重新绑定新的权限和 rkey。
- 适用场景:多租户场景、动态授权需求、临时访问场景、权限频繁变更的场景(如分布式内存池、分布式存储),MLX ConnectX 系列硬件原生优化适配。
0.3. 三、MW 的核心作用(为什么需要使用 MW)
- 细粒度权限隔离:同一 MR 内存区域内,不同 MW 可分配给不同远端节点,设置不同访问权限(如节点 A 只读、节点 B 读写、节点 C 可执行原子操作),实现精准权限控制。
- 动态安全控制:可随时作废某个 MW 的 rkey(Type2 可通过 INVALIDATE_MW WR),立即回收远端节点的访问权限,无需修改 MR 本身,响应速度快、安全性高。
- 减少 MR 注册开销:对于大容量内存,只需注册一次 MR(完成内存 pin 住、地址映射),后续通过切分多个 MW 分配给不同用户/节点,避免频繁执行 MR 注册/注销操作(减少 pin/unpin 内存的开销)。
- 地址空间复用:MR 的地址范围固定,MW 可在 MR 内动态调整起始偏移、内存长度,灵活适配不同远端节点的访问需求,提升内存利用率。
0.4. 四、Type2 MW 标准使用流程(MLX 推荐,固定 7 步)
基础环境初始化:依次执行「打开 IB 设备 → 分配 PD(保护域) → 创建 CQ(完成队列) → 创建 QP(队列对)」,QP 需配置为 RC 类型(可靠连接),确保 Send/Recv 队列、CQ 正常关联,为后续 MW 操作提供基础环境。
内存注册(一次性操作,可复用):先通过对齐分配(如
aligned_alloc)申请物理内存(需满足页对齐),再调用ibv_reg_mr接口注册 MR,注册时需指定 MR 的访问权限(至少包含本地写、远程读/写,适配 MW 后续授权需求),注册后获得 MR 的 lkey、rkey 及内存地址信息。分配 Type2 MW 对象:调用
ibv_alloc_mw(pd, IBV_MW_TYPE_2),传入 PD 和 Type2 类型标识,分配 MW 对象。注意:MW 必须关联 PD,且 Type2 为 MLX ConnectX 系列硬件最优支持类型,不可误设为 Type1。构造 BIND_MW WR(核心步骤):
- 绑定所属 MR:将步骤 2 注册的 MR 对象关联到 MW,确保 MW 在 MR 的地址范围内划分。
- 指定 MR 内偏移:设置 MW 在 MR 中的起始地址偏移(需为页对齐,避免地址越界),明确 MW 的起始位置。
- 指定窗口长度:定义 MW 占用的内存大小(需为页对齐),长度不可超过 MR 剩余未分配的内存空间。
- 设置远程访问权限:根据业务需求配置(如
IBV_ACCESS_REMOTE_READ、IBV_ACCESS_REMOTE_WRITE),权限需与 MR 注册时的权限兼容(不可超出 MR 的总权限)。 - 填入自定义 rkey:用户自行生成唯一 rkey(如随机值),作为远端访问该 MW 的凭证,这是 Type2 MW 的核心特性,便于权限管控和多租户隔离。
下发 WR 完成 MW 绑定:调用
ibv_post_send(qp, &wr, &bad_wr),将构造好的 BIND_MW WR 下发到 QP 的发送队列(SQ),待 CQ 收到完成通知后,MW 绑定生效,远端可通过自定义 rkey 访问该 MW。远端 RDMA 访问:远端节点获取「MR 虚拟地址 + MW 偏移」「MW 自定义 rkey」后,构造 RDMA Read/Write WR,下发后即可访问 MW 对应的内存区域,硬件会自动校验 rkey 有效性、地址范围和访问权限(三层校验:MR 地址范围、MW 地址范围、rkey 有效性)。
权限回收与资源释放(动态可控):
- 回收权限:构造
IBV_WR_INVALIDATE_MW类型 WR,指定需作废的 rkey,通过ibv_post_send下发,rkey 立即失效,远端再使用该 rkey 发起访问会直接报错,无需修改 MR 或其他 MW。 - 解绑与销毁:调用
ibv_dealloc_mw接口,释放 MW 对象资源,绑定的 MR 不受影响,可继续用于绑定其他 MW。
- 回收权限:构造
0.5. 五、关键接口/Opcode(MLX 标准,必记)
| 接口 / Opcode | 说明 |
|---|---|
ibv_alloc_mw(pd, IBV_MW_TYPE_2) |
核心接口,用于创建 Type2 MW 对象,依赖 PD,分配失败返回 NULL。 |
IBV_WR_BIND_MW(WR opcode) |
无封装库函数,需手动构造 WR 结构体,指定 MR、MW、偏移、长度、权限和自定义 rkey(MLX 标准用法)。 |
IBV_WR_INVALIDATE_MW(WR opcode) |
构造该类型 WR,传入需作废的 rkey,下发后立即回收权限,操作轻量无额外开销。 |
ibv_post_send(qp, &wr, &bad_wr) |
用于下发 BIND_MW、INVALIDATE_MW 等 WR,需传入 QP、WR 结构体和错误 WR 指针,返回 0 表示下发成功。 |
ibv_reg_mr(pd, buf, len, perm) |
注册物理内存为 MR,为 MW 提供基础内存空间。 |
ibv_dealloc_mw(mw) |
释放 MW 资源,不影响关联的 MR。 |
注意:全程不使用
ibv_bind_mw函数(MLX 官方不主推,该函数仅适配 Type1 MW,且性能和灵活性不如直接构造 WR,生产环境不建议使用)。
0.6. 六、使用约束(MLX 硬件适配,必遵守)
- 依赖约束:MW 不能独立存在,必须依附于某个已注册且未注销的 MR,MR 注销后,其关联的所有 MW 会自动失效。
- 数量约束:一个 MR 可划分多个 MW,多个 MW 可共享同一 MR 的内存空间,但各 MW 的地址区间不可重叠(避免访问冲突)。
- 地址约束:MW 的地址区间(MR 起始地址 + MW 偏移)必须完全在所属 MR 的地址范围内,不可越界,否则下发 BIND_MW WR 会失败。
- 权限约束:MW 的远程访问权限不可超出其所属 MR 的注册权限,否则硬件校验会失败,远端无法访问。
- 作废约束:
IBV_WR_INVALIDATE_MW仅作废当前 MW 的 rkey,不影响原 MR 的正常使用,也不影响该 MR 关联的其他 MW,权限回收精准可控。 - 修改约束:如需调整 MW 的偏移、长度或访问权限,无需重注册 MR,只需重新构造 BIND_MW WR(传入新参数)并下发,即可覆盖原有配置。
- 内存对齐约束:MW 的偏移和长度需满足页对齐要求,否则会导致绑定失败或硬件访问异常(适配 MLX 硬件要求)。