第一部分 · 5 / 6
RoCE 与 GID
RDMA 最早跑在 InfiniBand 专网上,用 LID 寻址。 而 RoCE(RDMA over Converged Ethernet)让 RDMA 跑在普通以太网上,用 GID 寻址。 理解 GID 和「GID 索引」是 RoCE 组网不踩坑的关键——选错索引是最常见的连不上原因。
InfiniBand vs RoCE
| InfiniBand | RoCE v1 | RoCE v2 最常用 | |
|---|---|---|---|
| 底层网络 | IB 专用网络 | 以太网(二层) | 以太网 + UDP/IP(可路由) |
| 寻址 | LID | GID(MAC 派生) | GID(含 IP 信息) |
| 跨子网路由 | 需 IB 路由器 | 不可路由 | 可路由(走 IP) |
现在数据中心绝大多数是 RoCE v2,因为它复用现有以太网/IP 基础设施、还能跨网段路由。
GID 是什么
GID(Global Identifier)是一个 16 字节的全局地址。在 RoCE v2 下,GID 里编码了 IP 信息, 所以可以从 IP 映射出来。在 gordma 里它就是一个定长数组,并带一个规范的字符串格式:
type GID [16]byte
// 渲染成习惯的 8 组 16 位冒号分隔形式
func (g GID) String() string {
// 形如 fe80:0000:0000:0000:....
}
GID 索引:最容易踩的坑
核心
一块网卡的 GID 表有很多行,每行对应一种组合:RoCE v1 / v2 × IPv4 / IPv6 × 不同 IP。
你必须用正确的行号(GID 索引),否则两端协商不上。
典型情况下,RoCE v2 + IPv4 往往落在某个固定索引上。本库的示例统一默认
GID 索引 3(-x 3),这是很多多网卡 RoCE 主机的常见布局,但不是绝对——
务必用工具确认你机器上的实际索引。
# 查看每块设备的 GID 表,找到 RoCE v2 / 你要用的 IP 对应的行号
show_gids
# 典型输出(节选),最后一列 VER=v2、IP 是你要用的网段 → 记下 index
# DEV PORT INDEX GID IPv4 VER
# mlx5_1 1 3 ::ffff:33.0.226.25 33.0.226.25 v2
LinkLayer:决定用 GID 还是 LID
查询端口属性(PortAttr)时有个 LinkLayer 字段:
| LinkLayer | 含义 | 寻址方式 |
|---|---|---|
"Ethernet" | RoCE | 用 GID(设 IsRoCE=true,填 DestGID/SGIDIndex) |
"InfiniBand" | IB | 用 LID(填 DestLID) |
回头看 QP 状态机里的 RCConnParams.IsRoCE,就是据此选择寻址路径。
设备命名约定(示例环境)
本库 examples 假设一个典型的多网卡 RoCE 主机(show_gids 布局):
mlx5_0→ CPU 网络(xgbe0)mlx5_1..mlx5_8→ GPU 网络(xgbe1..xgbe8)- 每块设备的 RoCE v2 都在 GID 索引 3
所以示例默认 -d mlx5_1 -x 3(第一块 GPU 网卡 + RoCE v2);用 -d mlx5_0 切到 CPU 网络。
下一步
概念齐了。下一节把它们串成 一次 RC 传输的完整流程,
然后你就能在第二部分看到 gordma 如何把每一步封装成方法。
gordma 教程