2. IB网络基础:InfiniBand架构、协议栈、关键概念(LID、GID、QPN等)
2.1 InfiniBand整体架构:从子网到端到端
InfiniBand(IB)是一种为高性能计算(HPC)和AI训练集群设计的高带宽、低延迟、可扩展的网络互连技术。与以太网“即插即用”的松散管理不同,IB网络采用集中式子网管理架构,所有转发决策、路径计算和地址分配都由子网管理器(Subnet Manager,SM)统一控制。理解IB架构,首先要区分两个层次:子网(Subnet)与IB域(IB Domain)。一个IB域可以包含多个子网,子网之间通过路由器连接;而单个子网内部,所有节点共享同一个SM的管理域,通过IB交换机(Switch)实现任意节点间的通信。
IB网络中的基本组件包括:
- 端节点(Host Channel Adapter,HCA):服务器或存储设备上的IB网卡,负责将主机内存中的数据封装为IB报文。
- 交换机(Switch):根据报文头部的DLID(目的本地标识)进行硬件级转发,不参与上层协议解析。
- 子网管理器(SM):可以是独立设备,也可以运行在某台服务器的HCA上(如OpenSM)。它负责发现网络拓扑、分配LID、计算路由表并下发至各交换机。
- 子网管理代理(Subnet Management Agent,SMA):每个IB节点(包括交换机)内部都驻留一个SMA,负责响应SM的查询和配置请求。
核心要点:IB网络是“管理面”与“数据面”分离的。SM通过专用的管理队列对(QP0)进行子网管理,而用户数据则通过QP1及以上的队列对进行传输。这种设计保证了管理操作的可靠性和数据转发的线速性能。
2.2 IB协议栈与报文封装
IB协议栈采用分层模型,与OSI模型有对应关系,但更精简高效。从下至上依次为:物理层(Physical Layer)、链路层(Link Layer)、网络层(Network Layer)、传输层(Transport Layer)以及上层的软件协议(如IPoIB、SDP、SRP)。IB规范中,链路层和网络层通常被合称为“IB子网层”,因为IB网络层本身不提供跨子网路由(跨子网需借助路由器)。
一个IB报文(Packet)的封装结构如下:
+------------------+----------------+------------------+------------------+------------------+
| LRH (链路路由头) | GRH (全局路由头) | BTH (基础传输头) | 传输层头 (可选) | 数据负载 (Payload) |
| 12 字节 | 40 字节(可选) | 12 字节 | 8-16 字节 | 0-4096 字节 |
+------------------+----------------+------------------+------------------+------------------+
| VCRC (可变CRC) | ICRC (不变CRC) | FECN/BECN (拥塞标记) | CRC (帧尾) | |
+------------------+----------------+------------------+------------------+------------------+
其中,LRH(Local Route Header)是每个IB报文必须携带的头部,包含SL(服务等级)、LID(源/目的LID)等关键字段,用于子网内交换机的快速转发。GRH(Global Route Header)仅在跨子网通信或使用RoCE(RDMA over Converged Ethernet)时启用,携带128位的GID(全局标识符)。BTH(Base Transport Header)则定义了操作码(OpCode)、目的QP号(Dest QP)、分组序号(PSN)等传输层信息。
2.3 关键概念:LID、GID、QPN与路径
在IB子网运维中,以下四个概念是排查故障、配置分区的基石,必须熟练掌握。
| 概念 | 全称 | 长度/格式 | 作用范围 | 分配方式 | 运维关注点 |
|---|---|---|---|---|---|
| LID | Local Identifier | 16 bit(1-49151) | 子网内唯一 | SM动态分配 | 路径转发、分区表配置 |
| GID | Global Identifier | 128 bit(IPv6格式) | 全局唯一 | 由SM分配+接口GUID组合 | 跨子网通信、RoCE |
| QPN | Queue Pair Number | 24 bit | 节点内唯一 | HCA驱动分配 | QP状态查询、错误定位 |
| P_Key | Partition Key | 16 bit | 子网内分区标识 | SM配置 | 访问控制、广播隔离 |
2.3.1 LID(本地标识符)
LID是IB子网内每个端口(Port)的二层地址,类似于以太网中的MAC地址,但由SM动态分配。交换机依靠报文中的DLID查找转发表,将报文从正确的端口转发出去。LID范围中,0x0000保留,0xFFFF用于广播,0xFFFE用于多播。运维时,使用ibquery或ibstatus命令可以查看节点的LID。
2.3.2 GID(全局标识符)
GID是128位的地址,由64位子网前缀(Subnet Prefix)和64位端口GUID拼接而成。默认情况下,子网前缀由SM指定(通常为0xfe80000000000000),端口GUID则烧录在HCA硬件中。GID主要用于跨子网通信,以及RoCEv2(基于UDP的RoCE)场景。在ibv_devinfo命令输出中,可以看到每个端口对应的GID列表。
2.3.3 QPN(队列对编号)
QP(Queue Pair)是IB通信的基本端点,由发送队列(SQ)和接收队列(RQ)组成。每个QP都有一个唯一的QPN,由HCA驱动在创建QP时分配。通信双方需要交换彼此的QP号、LID和GID才能建立连接。在排查“连接超时”或“QP错误”时,ibv_asyncwatch或perftest输出中的QPN信息是定位问题的重要线索。
运维提示:在IB网络中,ibping命令使用LID进行连通性测试,而rping或ib_write_bw等测试工具则需要指定GID或LID。当遇到“路径未解析”错误时,优先检查ibstatus中端口是否处于Active状态,以及ibquery -p查看SM是否已正确分配LID。
2.4 子网管理与路径计算流程
SM是IB子网的大脑。当子网拓扑发生变化(如新节点接入、链路断开)时,SM会执行以下流程:
- 发现(Discovery):SM通过SMA发送
SubnGet请求,遍历所有交换机端口,收集节点类型、端口GUID、链路速率等信息,构建完整的拓扑图。 - 寻址(Addressing):SM为每个端口分配唯一的LID,并配置交换机的转发表(Forwarding Database)。
- 路径计算(Routing):SM使用最短路径优先(SPF)算法(如Dijkstra)计算任意两个端口之间的最优路径。对于多路径(LMC > 0)场景,SM会生成多条等价路径。
- 下发配置(Configuration):SM将转发表、分区表(P_Key表)等配置写入每个交换机的SMA。
- 监控(Monitoring):SM持续监控链路状态,一旦发现链路故障,立即重新计算路径并更新转发表。
在Linux系统中,OpenSM是最常用的SM实现。启动OpenSM后,可以通过ibswitches查看交换机列表,通过ibroute查看特定LID的转发路径。
# 查看本机IB端口状态
ibstatus
# 查看SM分配的LID和GID
ibv_devinfo
# 查看子网中所有已知节点
ibquery -p
# 查看从本机到目标LID的路由路径
ibroute -n 2 0x2 # 假设目标LID为0x2
2.5 常见误区与故障复盘
误区一:混淆LID与GID的作用域。LID只在子网内有效,跨子网通信必须依赖GID。在配置路由或防火墙规则时,如果错误地使用LID代替GID,会导致跨子网报文被丢弃。
误区二:忽略P_Key(分区键)的隔离作用。即使两个节点的LID和GID都正确,如果它们不在同一个P_Key分区内,数据包依然会被交换机丢弃。排查“能ping通但无法建连”的问题时,务必检查双方P_Key是否一致。
误区三:认为QP错误只是软件问题。QP进入错误状态(Error State)往往与链路质量、缓冲区溢出或对端QP未初始化有关。仅重启应用而不检查底层链路(如ibstat中的LinkDownedCounter)无法根治问题。
复盘案例:某AI集群中,节点A与节点B之间运行NCCL测试时频繁超时。通过ibstatus发现两端端口均为Active,但ibquery -p显示节点B的LID为0x12,而节点A的ARP缓存中记录的LID为0x11(旧地址)。原因是节点B的HCA固件升级后,SM重新分配了LID,但节点A的IPoIB驱动未刷新ARP表。执行ip neigh flush dev ib0后通信恢复正常。此案例说明,LID是动态分配的,任何拓扑变更后,必须刷新依赖LID的缓存或重新建立连接。