2、InfiniBand基础:InfiniBand架构、协议栈、关键术语(子网管理器、LID、GID等)
2.1 InfiniBand整体架构
InfiniBand(IB)是一种高性能、低延迟、高可靠性的互联技术,最初由InfiniBand贸易联盟(IBTA)于2000年前后标准化,广泛应用于高性能计算(HPC)、人工智能训练集群、存储网络以及数据中心场景。与以太网“无序、尽力而为”的设计哲学不同,IB从诞生起就面向通道化、有损可控、硬件卸载的通信模型。
IB网络在物理上由四类核心组件构成:端节点(Host Channel Adapter, HCA)、交换机(Switch)、链路(Link)以及子网管理器(Subnet Manager, SM)。HCA通常集成在服务器或存储设备上,负责将主机内存中的数据封装为IB报文;交换机负责在子网内根据LID转发数据;链路则定义了从1X到12X的物理宽度以及SDR、DDR、QDR、FDR、EDR、HDR、NDR等速率代际。
IB网络采用子网(Subnet)作为基本管理域。一个子网内可以包含多个交换机、多个端节点,但必须至少有一个活跃的子网管理器。子网之间通过路由器(Router)互联,路由器基于GID(全局ID)进行跨子网转发。这种“子网内LID交换、子网间GID路由”的两级寻址机制,是IB与以太网最本质的区别之一。
2.2 IB协议栈与报文封装
IB协议栈采用分层模型,但不同于OSI七层模型,它更强调硬件卸载和直接内存访问(RDMA)。从下到上主要分为:物理层(Physical Layer)、链路层(Link Layer)、网络层(Network Layer)、传输层(Transport Layer)以及上层的软件协议(如IPoIB、SRP、SDP等)。
- 物理层:定义电气特性、连接器(QSFP/OSFP)、链路速率(SDR 2.5Gbps/lane 至 NDR 200Gbps/lane)以及前向纠错(FEC)机制。
- 链路层:负责子网内数据帧的传递,核心地址是LID(Local Identifier),同时负责流控(基于信用机制)和链路级错误检测(CRC)。
- 网络层:负责跨子网路由,使用GID(Global Identifier)作为端到端地址。GID本质上是基于IPv6格式的128位地址,通常由子网前缀(64位)+ 端口GUID(64位)构成。
- 传输层:提供可靠连接(RC)、不可靠连接(UC)、可靠数据报(RD)、不可靠数据报(UD)等传输服务,并负责报文分段、重组、多路复用。
IB报文在链路上传输时,会依次添加本地路由头(LRH)、全局路由头(GRH,仅跨子网时存在)、基础传输头(BTH)等。其中LRH包含源LID、目的LID、服务等级(SL)等关键字段;GRH包含源GID、目的GID;BTH则包含操作码(OpCode)、目的QP(队列对)号、分组序号(PSN)等。
IB 报文封装示意(跨子网场景):
+----------------+----------------+----------------+----------------+----------------+
| LRH (12B) | GRH (40B) | BTH (12B) | Payload | ICRC/VCRC |
| 源LID/目的LID | 源GID/目的GID | OpCode/QP/PSN | 数据段 | 校验 |
+----------------+----------------+----------------+----------------+----------------+
|←—— 链路层 ——→|←—— 网络层 ——→|←—— 传输层 ——→|←—— 上层数据 ——→|←—— 链路层 ——→|
2.3 关键术语详解:SM、LID、GID、Q_Key等
在配置IB交换机时,以下术语出现的频率最高,理解不透彻极易导致配置错误或网络不通。
| 术语 | 全称/含义 | 作用域 | 关键说明 |
|---|---|---|---|
| SM | Subnet Manager,子网管理器 | 子网内 | 负责发现拓扑、分配LID、计算路由表、配置交换机转发表。一个子网可有多个SM(主备),但同一时刻只有一个活跃SM。 |
| LID | Local Identifier,本地标识符 | 子网内 | 16位地址,由SM分配。范围1-0xBFFF可用于单播,0xC000-0xFFFF保留多播。交换机依靠LID转发数据帧。 |
| GID | Global Identifier,全局标识符 | 跨子网 | 128位,格式为“子网前缀(64位):端口GUID(64位)”。子网前缀由SM配置,端口GUID出厂烧录。 |
| GUID | Globally Unique Identifier | 设备级 | 64位,类似以太网MAC地址,出厂唯一。用于标识HCA、交换机端口等。 |
| QP | Queue Pair,队列对 | 端节点 | 通信的基本载体,由发送队列(SQ)和接收队列(RQ)组成。QP号是传输层寻址的关键。 |
| Q_Key | Queue Pair Key | 端节点 | 类似“访问密钥”,用于保护QP不被非法访问。通信双方必须匹配Q_Key。 |
| P_Key | Partition Key,分区键 | 子网内 | 16位,用于隔离不同租户/业务。只有P_Key相同的端口才能通信,类似VLAN。 |
| SL | Service Level,服务等级 | 链路层 | 4位,用于QoS和流控,可映射到不同虚拟通道(VL)。 |
2.4 子网管理器的工作流程
理解SM的工作流程,对后续排查“节点无法上线”“LID冲突”等问题至关重要。SM启动后,会经历以下阶段:
- 发现(Discovery):SM通过发送管理数据报(MAD)扫描子网内所有交换机、HCA、路由器,收集它们的GUID、端口数、链路状态等信息。
- 分配LID:SM为每个端节点端口分配唯一的LID。如果节点配置了静态LID,SM会优先保留;否则从动态LID池中分配。
- 路由计算:SM根据拓扑结构计算从每个端节点到其他端节点的最优路径,生成交换机的线性转发表(LFT)。
- 下发配置:SM将LFT、P_Key表、SL映射等配置下发到各交换机,并激活端口。
- 持续监控:SM周期性地发送“SubnGet”等管理报文,监控链路状态变化。当拓扑变更(如新交换机接入)时,重新执行上述流程。
2.5 案例:一个典型的两层IB子网配置
假设某AI集群有8台GPU服务器(每台配1块HCA),通过2台36端口IB交换机(型号如NVIDIA Quantum QM8700)组成一个子网。规划如下:
- 交换机1的端口1-8连接服务器1-4,交换机2的端口1-8连接服务器5-8。
- 交换机1与交换机2之间使用4条链路做胖树(Fat-Tree)上行互联。
- SM运行在服务器1上(也可运行在交换机控制模块上)。
配置完成后,通过ibstatus命令查看HCA状态,应看到类似输出:
InfiniBand device 'mlx5_0' port 1 status:
state: ACTIVE
physical state: LinkUp
rate: 200 (HDR)
base_lid: 0x01
lmc: 0
link_layer: InfiniBand
其中state: ACTIVE表示端口已由SM激活,base_lid: 0x01表示SM分配的LID为1。如果状态为INIT或ARM,则说明SM未正确下发配置或P_Key不匹配。
2.6 误区与复盘:LID冲突与P_Key隔离失效
场景一:LID冲突导致路由黑洞。某管理员手动为多台服务器配置了相同的静态LID(如LID=5),SM在发现阶段检测到冲突后,会拒绝激活其中一个端口,导致该节点无法通信。复盘结论:生产环境应尽量使用SM动态分配LID,除非有特殊QoS或路由策略需求,且必须通过sminfo和ibroute工具核对LID分配表。
场景二:P_Key配置不一致导致“能ping通但RDMA失败”。两个节点虽然IPoIB通信正常,但运行RDMA应用时连接超时。排查发现,节点A的P_Key为0xFFFF(默认全通),节点B的P_Key为0x8001,两者不匹配。复盘结论:P_Key是IB子网内隔离的关键,配置时必须确保通信双方以及交换机端口上的P_Key表完全一致。使用ibportstate命令可以查询端口P_Key表。
- IB子网必须存在活跃SM,否则交换机端口无法转发数据。
- LID是子网内二层地址,由SM分配,范围1~0xBFFF。
- GID是三层地址,用于跨子网路由,格式为“子网前缀:GUID”。
- P_Key是分区隔离机制,类似以太网VLAN,配置不一致会导致通信失败。
- 排查IB故障时,先看
ibstatus确认端口状态,再用ibnetdiscover查看拓扑,最后用ibroute检查路由表。