第二部分 · 2 / 7
两层 API:选哪个?
这是理解整个库最关键的一点。gordma 从同一套底层硬件资源出发,提供了两个抽象层级——
底层 gordma 包给你完全控制权,高层 rdmanet 包让你像写
net 一样写业务。
两层对照
底层 ·
gordma 包直接操作 Device / Context / PD / MR / CQ / QP / AH。你自己注册内存、投递 WR、轮询 CQ、驱动 QP 状态机。完全控制,适合复刻 perftest 这类需要精细操作的场景。
高层 ·
rdmanet 包像标准库 net 一样 Dial / Listen / SendMsg / RecvMsg。内存注册、WR 投递、CQ 轮询、流控全部隐藏。适合直接写业务。
同一件事,两种写法
实现一个「收一条消息」的服务端,差距一目了然:
// ── 高层 rdmanet:几行搞定 ──
ln, _ := rdmanet.Listen("0.0.0.0:18515")
conn, _ := ln.Accept()
msg, _ := conn.RecvMsg() // 一条完整消息,保留边界
// ── 底层 gordma:自己走完七步 ──
// 1. GetDeviceList → Open
// 2. AllocPD → RegMRBuffer → CreateCQ → CreateQP
// 3. 带外握手交换 QPN/PSN/GID/rkey
// 4. ModifyToInit → RTR → RTS
// 5. post_recv
// 6. 轮询 CQ 拿 WorkCompletion
// 7. 各对象 Close()
// (完整实现见 perftest/ 包)
怎么选
| 你的情况 | 建议 |
|---|---|
| 写业务、要 net 风格的收发 | rdmanet(高层) |
要 io.Reader/io.Writer 兼容、用 io.Copy | rdmanet 的字节流适配器 |
| 要复刻 perftest、精确控制每个 WR 与 QP 参数 | gordma(底层) |
| 要用单边 RDMA Write/Read | gordma(底层,高层目前聚焦消息/数据报语义) |
| 要实现自定义传输协议 / 流控 | gordma(底层) |
关系
两层用的是同一套硬件资源——高层
rdmanet 内部就是调用底层 gordma 的对象搭起来的。
所以选高层不会「损失」什么,只是把样板和流控交给库去管。需要时你随时能下沉到底层。
gordma 教程