教程概览
gordma:用 Go 写 RDMA 网络程序
gordma 是对 libibverbs 与 librdmacm(来自 rdma-core)的地道 Go 封装, 并附带一套仿 perftest 的带宽/时延工具。 本教程分三部分,每一节独立成页,可循着左侧目录或页脚的「上一页 / 下一页」顺序阅读。
第一部分 · RDMA 概念
内核旁路与零拷贝、Verbs 对象模型、QP 状态机、RC/UD、RoCE 与 GID,最后串成一次完整传输。
第二部分 · gordma 库
两层 API 的取舍、底层 verbs 封装、高层 rdmanet、两种连接方式、性能选项与跨平台 stub。
第三部分 · cmd & examples
8 个 perftest 风格性能工具的用法与排错,外加 17 个按功能拆分的 rdmanet 示例逐个讲解。
这个库适合谁
如果你需要在 Go 程序里使用高性能网络(典型是 RoCE v2 上的 Mellanox/NVIDIA 网卡), 又不想直接和 C 的 verbs API 打交道,gordma 给了你两个选择:
- 底层
gordma包:一一对应 rdma-core 的对象(Device、Context、PD、MR、CQ、QP、AH、CompChannel), 给你完全的控制权,适合复刻 perftest 这类需要精细操作的场景。 - 高层
rdmanet包:像标准库net一样的Dial/Listen, 隐藏内存注册、工作请求投递、完成队列轮询和流控,适合直接写业务。
提示
全部代码在任何平台都能 编译(macOS/Windows 走 stub),但只有装了
libibverbs/librdmacm 且有 RDMA 硬件的 Linux 才能真正运行 RDMA 操作。
30 秒上手
用高层 API 写一个回显服务,和标准库 net 几乎一样:
// 服务端
ln, _ := rdmanet.Listen("0.0.0.0:18515")
defer ln.Close()
conn, _ := ln.Accept()
msg, _ := conn.RecvMsg() // 一条完整消息,保留边界
// 客户端
conn, _ := rdmanet.Dial("10.0.0.1:18515")
defer conn.Close()
_ = conn.SendMsg([]byte("hello"))
准备好了吗?从 第一部分:什么是 RDMA 开始。
gordma 教程