InfiniBand基础:核心概念、术语与协议栈概述
InfiniBand(IB)并非简单的“高速网卡+交换机”,而是一套完整的通道式互联架构。理解它的起点,是建立三个关键认知:子网是管理域、LID是子网内寻址、GID是跨子网寻址。本节将梳理这些核心概念,并勾勒协议栈的分层逻辑。
2.1 核心概念与术语
2.1.1 子网与子网管理器(SM)
一个IB子网由若干节点(主机、交换机、路由器)通过链路互连而成,并由一个子网管理器(Subnet Manager, SM)统一管控。SM负责发现拓扑、分配LID、计算路由表并下发到各交换机。SM通常运行在某个计算节点上(如Mellanox的opensm),也可配置为双机热备。
关键点:IB子网内的所有转发决策都由SM预先计算并下发,数据报文本身不携带路由信息,这与以太网的逐跳自学习机制有本质区别。
2.1.2 LID与GID
- LID(Local Identifier):16位地址,由SM在子网内动态分配,仅在本地子网有效。LID用于子网内交换机的转发决策,每个端口至少有一个LID,可配置多个(用于多路径)。
- GID(Global Identifier):128位地址,由“子网前缀(64位)+ 端口GUID(64位)”构成。GID用于跨子网通信,类似于IPv6地址。子网前缀由SM配置,端口GUID出厂时烧录。
| 地址类型 | 长度 | 分配方式 | 作用域 | 典型用途 |
|---|---|---|---|---|
| LID | 16 bit | SM动态分配 | 子网内 | 交换机转发、数据包寻址 |
| GID | 128 bit | 子网前缀+GUID | 跨子网 | 路由器寻址、RoCE v2 |
| GUID | 64 bit | 出厂烧录 | 全局唯一 | 标识端口/设备 |
2.1.3 其他关键术语
- Queue Pair(QP):通信端点,由QP号(QPN)标识。每个QP包含发送队列和接收队列,软件通过QP发起数据传输。
- Work Request(WR):软件下发的传输请求,描述数据缓冲、长度、操作类型等。
- Completion Queue(CQ):异步通知机制,硬件完成WR后向CQ写入完成事件。
- Partition Key(P_Key):16位分区标识,用于子网内隔离,类似VLAN。
- MTU:IB链路层最大传输单元,常见为2048/4096字节,远大于以太网的1500字节。
2.2 协议栈概述
IB协议栈分为物理层、链路层、网络层、传输层,上层软件接口为Verbs API。与TCP/IP不同,IB的传输层直接面向内存语义,支持RDMA操作。
上图展示了IB协议栈的纵向分层关系。其中传输层是RDMA的核心,它直接面向内存操作;链路层则承载了子网管理的全部逻辑。需要特别注意的是,IB的“网络层”仅在跨子网通信时启用,子网内部通信不经过网络层。
2.3 核心原理:从Verbs到硬件
一次典型的RDMA写操作流程如下:
- 软件调用
ibv_post_send(),将一个WR(工作请求)提交到QP的发送队列。 - 硬件(HCA)从内存中读取WR描述的数据缓冲,直接通过DMA将数据发送到对端。
- 对端硬件收到数据后,根据WR中的目的内存地址,通过DMA将数据直接写入目标内存。
- 两端硬件分别向各自的CQ写入完成事件(CQE),通知软件操作已完成。
理解要点:整个过程中,CPU不参与数据搬运,仅负责提交请求和接收完成通知。这就是“内核旁路”和“零拷贝”的实质。
2.4 案例:集群中LID与GID的分配
假设一个双节点集群,每个节点配置一块双端口HCA,通过一台IB交换机互连。SM启动后执行以下操作:
# 查看SM分配的LID(以opensm为例)
# 节点A的HCA端口1
ibstat | grep -E "Port|Lid"
Port 1:
State: Active
Physical State: LinkUp
LID: 0x01
GID: fe80::0000:0000:0000:0001
# 节点B的HCA端口1
Port 1:
State: Active
Physical State: LinkUp
LID: 0x02
GID: fe80::0000:0000:0000:0002
# 交换机端口LID
# 交换机本身也有LID,用于SM管理通信
ibswitches
Switch 0x0002c9030000abcd:
LID: 0x03
在这个例子中,LID 0x01和0x02分别标识两个节点的端口,交换机端口LID为0x03。当节点A向节点B发送数据时,交换机根据目的LID(0x02)查找转发表,将报文从对应端口转发出去。整个过程不涉及IP地址或MAC地址。
2.5 常见误区与复盘
误区1:将LID等同于IP地址。
LID仅在子网内有效,且由SM动态分配。如果重启SM或拓扑变化,LID可能改变。而IP地址在IB网络中是可选配置(通过IPoIB),用于上层应用,不参与IB转发决策。
LID仅在子网内有效,且由SM动态分配。如果重启SM或拓扑变化,LID可能改变。而IP地址在IB网络中是可选配置(通过IPoIB),用于上层应用,不参与IB转发决策。
误区2:认为GID就是GUID。
GID是128位地址,由“子网前缀+GUID”组成。GUID是64位硬件标识,出厂固定。同一端口在不同子网中会获得不同的GID,但GUID不变。
GID是128位地址,由“子网前缀+GUID”组成。GUID是64位硬件标识,出厂固定。同一端口在不同子网中会获得不同的GID,但GUID不变。
误区3:忽略P_Key的作用。
P_Key用于子网内分区隔离。如果两个节点P_Key不匹配,即使LID可达,也无法通信。在配置多租户集群时,P_Key是重要的安全边界。
P_Key用于子网内分区隔离。如果两个节点P_Key不匹配,即使LID可达,也无法通信。在配置多租户集群时,P_Key是重要的安全边界。
复盘建议:在排查IB通信故障时,首先使用
ibstatus确认端口状态和LID,再使用ibping测试LID连通性,最后检查P_Key配置。不要一开始就怀疑物理链路。