术语表
术语表
RDMA 编程和普通的 socket 网络编程很不一样——它有一整套自己的对象、动词和缩写。 这一页把全教程会用到的 RDMA 概念与相关编程术语集中起来,按主题分组,方便随时回查。 正文里第一次出现某个术语时,可以回到这里对照。
基础概念
| 术语 | 英文 / 全称 | 含义 |
|---|---|---|
| RDMA | Remote Direct Memory Access | 远程直接内存访问:一台机器的网卡直接读写另一台机器的内存,绕过对端 CPU 与内核。 |
| 内核旁路 | Kernel Bypass | 应用在用户态直接与网卡交互,数据路径不经过内核协议栈,省去系统调用与上下文切换。 |
| 零拷贝 | Zero-copy | 网卡用 DMA 直接搬运已注册的用户态缓冲区,无需内核↔用户的多次内存复制。 |
| CPU 卸载 | CPU Offload | 传输、重传、校验由网卡硬件完成;单边操作时对端 CPU 完全不参与。 |
| DMA | Direct Memory Access | 直接内存访问:硬件(网卡)不经 CPU 直接读写主存。 |
| HCA | Host Channel Adapter | 主机通道适配器,即 RDMA 网卡,如 mlx5_0。 |
| Verbs | — | RDMA 的编程接口(一组"动词"操作);用户态实现是 libibverbs。 |
| rdma-core | — | Linux 的 RDMA 用户态库集合,含 libibverbs 与 librdmacm。 |
Verbs 对象模型
| 术语 | 英文 / 全称 | 含义 |
|---|---|---|
| Device | 设备 | 一块 RDMA 网卡(HCA)。 |
| Context | 设备上下文 | 打开设备后的句柄,后续所有资源都从它派生。 |
| PD | Protection Domain(保护域) | 把 MR / QP 等资源归到同一组,做隔离与权限边界。 |
| MR | Memory Region(内存区域) | 注册(pin 住)的内存,网卡只能访问已注册内存;返回 lkey/rkey。 |
| CQ | Completion Queue(完成队列) | 每个操作完成后,网卡往这里放一个完成事件(WC)。 |
| QP | Queue Pair(队列对) | 发送队列(SQ)+接收队列(RQ),RDMA 的"连接"端点,类比 socket。 |
| SQ / RQ | Send / Receive Queue | QP 内的发送队列与接收队列。 |
| AH | Address Handle(地址句柄) | UD 传输里描述对端地址的对象。 |
| CompChannel | Completion Channel(完成通道) | 让你能"等待"CQ 上的事件而非忙等轮询。 |
| 注册 / pin | Register / Pin | 把内存固定在物理页并告知网卡,使其可被 DMA 访问。 |
钥匙与地址
| 术语 | 英文 / 全称 | 含义 |
|---|---|---|
| lkey | Local Key | 本地工作请求引用自己缓冲区时用的 MR 钥匙。 |
| rkey | Remote Key | 授权远端对本地 MR 做 RDMA Read/Write,需带外发给对方。 |
| GID | Global Identifier | 16 字节全局地址,RoCE 下用它寻址(内含 IP 信息)。 |
| GID Index | GID 表索引 | 网卡 GID 表的行号,区分 RoCE v1/v2 与 IPv4/v6;RoCE v2 常在索引 3。 |
| LID | Local Identifier | InfiniBand 子网内的本地标识,IB 寻址用(RoCE 下为 0)。 |
| QPN | Queue Pair Number | 队列对编号,建连时需交换对端 QPN。 |
| PSN | Packet Sequence Number | 包序列号,迁移 QP 到 RTR/RTS 时设置起始值。 |
| QKey | Queue Key | UD 传输的密钥,两端必须一致数据报才被接受。 |
| GRH | Global Routing Header | UD 每个收到的数据报前的 40 字节全局路由头,需跳过才是负载。 |
传输与操作
| 术语 | 英文 / 全称 | 含义 |
|---|---|---|
| RC | Reliable Connected | 可靠连接,面向连接、有序可靠,类比 TCP;支持 Send/Recv 与单边 Write/Read。 |
| UD | Unreliable Datagram | 不可靠数据报,无连接、单条不超 MTU,类比 UDP;仅 Send/Recv。 |
| UC | Unreliable Connected | 不可靠连接(gordma 非主要目标)。 |
| 双边操作 | Two-sided(Send/Recv) | 接收方需预投递 Recv WR,双方 CPU 都参与,语义最像 socket。 |
| 单边操作 | One-sided(RDMA Write/Read) | 发起方凭 rkey+远端地址直接读写对端内存,对端 CPU 不感知,时延最低。 |
| MTU | Maximum Transmission Unit | 路径最大传输单元(256/512/1024/2048/4096 字节)。 |
| RoCE | RDMA over Converged Ethernet | 在以太网上跑 RDMA;RoCE v2(基于 UDP/IP,可路由)最常用。 |
| InfiniBand (IB) | — | RDMA 最早的专用网络,用 LID 寻址。 |
QP 状态机
| 术语 | 英文 / 全称 | 含义 |
|---|---|---|
| RESET | — | QP 初始状态。 |
| INIT | Initialized | 设好端口与访问权限,但还不能收发。 |
| RTR | Ready To Receive | 填入对端 QPN/PSN/GID 等,可以开始接收。 |
| RTS | Ready To Send | 填入本地起始 PSN,可以开始发送。 |
| 状态迁移 | Modify QP | RESET→INIT→RTR→RTS,靠 ibv_modify_qp 逐步设置。 |
| 带外握手 | Out-of-band Handshake | 用普通 TCP 或 librdmacm 交换 QPN/PSN/GID/rkey,因为这些没法用 RDMA 本身交换。 |
| rdma_cm | RDMA Connection Manager | librdmacm 提供的类 socket 建连流程,完成后 QP 直接在 RTS。 |
| RNR | Receiver Not Ready | 发来时对端没有可用 Recv WR,触发重试机制。 |
工作请求与完成
| 术语 | 英文 / 全称 | 含义 |
|---|---|---|
| WR | Work Request(工作请求) | 投递到 QP 的一次收发请求,由网卡异步执行。 |
| SR / RR | Send / Receive Request | 发送工作请求 / 接收工作请求(SendWR/RecvWR)。 |
| post | Post(投递) | 把 WR 提交到发送/接收队列(ibv_post_send/ibv_post_recv)。 |
| SGE | Scatter/Gather Element | 指向已注册 MR 一段内存的描述(地址+长度+lkey);一个 WR 可带多个。 |
| WC | Work Completion(完成项) | 轮询 CQ 得到的一条完成记录,含 WRID、状态、字节数等。 |
| WRID | Work Request ID | post 时填的用户标识,在对应的 WC 里原样返回,用来对号。 |
| poll | Poll(轮询) | 从 CQ 取出完成项(ibv_poll_cq)。 |
| signaled / unsignaled | — | WR 是否产生完成事件;选择性 signal 可减少 CQE 数量、提升消息率。 |
| inline | Inline Send | 小消息把负载内联进 WR,省一次内存读取的优化。 |
| opcode | — | WR 的操作类型:SEND / RDMA_WRITE / RDMA_READ 等。 |
性能与流控
| 术语 | 英文 / 全称 | 含义 |
|---|---|---|
| in-flight | 在途 / 未完成 | 已 post 但还没收到完成的 WR 数;流水线深度即同时 in-flight 的数量。 |
| tx-depth / queue depth | 发送深度 / 队列深度 | 允许同时 in-flight 的 WR 上限(QP 的 max_send_wr/max_recv_wr)。 |
| 流水线 | Pipelining | 同时让多个 WR in-flight 以隐藏单次往返延迟、打满带宽。 |
| 忙轮询 / 事件驱动 | Busy-poll / Event-driven | 排空 CQ 的两种方式:自旋轮询(低延迟、吃 CPU)vs 等完成通道事件(省 CPU、略有延迟)。 |
| 信用流控 | Credit-based Flow Control | 发送方按对端已投递的 Recv 数量(信用)限发,避免 RNR。 |
| 背压 | Backpressure | 接收方处理不过来时反向限制发送速率。 |
| bounce buffer | 反弹缓冲区 | 库托管的中转缓冲:先把用户数据拷进它再发;零拷贝就是省掉这次拷贝。 |
| 批量提交 | Batched Post | 用 WR 链表一次 ibv_post_send 提交多个 WR,摊薄每次调用开销。 |
| 分片 / 重组 | Fragmentation / Reassembly | 大消息拆成多帧发送、接收端重组回完整消息。 |
| 带宽 / 时延 | Bandwidth (bw) / Latency (lat) | 吞吐(Gb/s)与往返延迟,对应 *_bw/*_lat 工具。 |
| Mpps | Million packets/messages per second | 每秒百万消息数,衡量消息率(小包瓶颈常在此而非带宽)。 |
gordma / 编程相关
| 术语 | 说明 |
|---|---|
| cgo | Go 调用 C 的机制;gordma 用它封装 libibverbs/librdmacm。每次跨界有固定开销。 |
| build tag / 构建标签 | Go 的条件编译标记;gordma 用 linux && cgo 选真实实现、否则选 stub。 |
| stub | 桩实现:非 Linux/无 cgo 时编译,入口返回 ErrNotSupported 而非崩溃。 |
| perftest | C 版 RDMA 性能基准工具集;gordma 的 cmd/ 工具对标它。 |
gordma 包 | 底层:一比一映射 verbs 对象模型,完全控制。 |
rdmanet 包 | 高层:net 风格的 Conn/Listener/PacketConn,隐藏注册/投递/轮询/流控。 |
Conn | RC 可靠连接端点(消息语义 + 字节流适配器)。 |
PacketConn | UD 数据报端点(WriteTo/ReadFrom)。 |
RawConn | 低层高吞吐端点:无封帧/流控/handoff,量级追平 perftest。 |
| Addr | UD 端点地址,格式 gid%qpn[#qkey]。 |
| Registry | UD 的"名字→Addr"目录,带外发现对端。 |
下一步
词汇备齐了,从 第一部分:什么是 RDMA 开始正式学习。读到不认识的缩写随时回来查。
gordma 教程