InfiniBand基础:IB网络架构、协议栈与关键概念

核心原理:IB不是“更快的以太网”,而是一套独立的网络体系

InfiniBand(IB)最初面向高性能计算(HPC)设计,其核心思想是卸载CPU、降低时延、提供高可靠的有损网络。与以太网“尽力而为”的转发模型不同,IB从链路层就定义了基于信用(Credit)的流控机制,保证数据包在传输过程中不丢包。这一根本差异决定了后续所有配置与调优手段的出发点。

IB网络采用子网(Subnet)作为基本管理域。一个子网内至少有一个子网管理器(Subnet Manager, SM),负责发现拓扑、分配关键地址(LID)、计算路由。IB的物理拓扑通常是胖树(Fat-Tree)或Torus,但逻辑上对端节点呈现为通道(Channel)——通信双方通过队列对(QP)建立逻辑连接,无需关心底层物理路径。

关键认知:IB的“通道语义”与以太网的“报文路由”有本质区别。在IB中,数据从发送方内存直接“流入”接收方内存(RDMA),中间经过的交换机只做转发,不参与端到端确认。因此,IB调优的核心在于子网管理器配置与端节点QP参数,而非TCP/IP栈参数。
IB子网核心组件与地址分配关系 子网管理器 (SM) • 发现拓扑 • 分配LID • 计算路由 IB交换机 (Switch) • 基于LID转发 • 不感知QP • 逐跳流控 管理/发现 节点A (HCA) LID: 0x0001 GID: fe80::1 QP: 0x11 (发送) QP: 0x12 (接收) SRQ: 0x01 节点B (HCA) LID: 0x0002 GID: fe80::2 QP: 0x21 (发送) QP: 0x22 (接收) SRQ: 0x02 数据包 (基于LID转发) IB协议栈分层 应用层 verbs API / MPI 传输层 QP / SRQ / 操作类型 网络层 LID / GID / 路由 链路层 流控 / 编码 / 物理 物理层 信号 / 线缆

关键概念详解:从LID到SRQ

IB网络中的地址与标识体系与TCP/IP完全不同,理解这些概念是配置网卡和排查故障的前提。

概念层级作用与特点类比(以太网)
LID网络层16位本地标识,由SM分配,用于子网内路由。每个端口至少1个LID,可配置多个。MAC地址(但由SM统一分配)
GID网络层128位全局标识,基于IPv6格式,由子网前缀+端口GUID生成。用于跨子网通信。IP地址
QP传输层队列对,包含发送队列(SQ)和接收队列(RQ)。通信前必须建立QP连接。TCP Socket
SRQ传输层共享接收队列,多个QP可共用同一SRQ,减少内存占用。无直接类比
AH传输层地址句柄,封装目的LID、SL等路由信息,发送时引用。路由表项

方法流程:QP建立通信的完整路径

在IB中,两个节点通信前必须经历以下状态机转换。这一过程通常由verbs API(如rdma_cm)自动完成,但理解其底层逻辑有助于排查“连接超时”类问题。

  1. 初始化:HCA驱动加载,SM发现端口并分配LID。
  2. 创建QP:调用ibv_create_qp(),指定发送/接收队列深度、最大SGE数等参数。
  3. 状态迁移:QP从RESET → INIT → RTR(Ready to Receive)→ RTS(Ready to Send)。
  4. 交换信息:通过带外通道(如TCP)交换QP编号、LID、GID等信息。
  5. Post Send/Recv:调用ibv_post_send()和ibv_post_recv()提交工作请求(WR)。
  6. 完成通知:操作完成后,完成队列(CQ)产生完成事件(WC)。
# 查看本机IB端口状态(含LID、GID、端口速率)
ibstat

# 查看SM分配的路由表
ibroute -n 0x0001

# 测试QP连通性(类似ping)
ibping -S -L 0x0002

案例场景:多GPU节点间的SRQ配置

在4节点GPU集群中,每个节点有8张A100 GPU,需要与另外3个节点建立通信。若采用每QP独立接收队列,每个节点需要创建大量QP,内存开销巨大。使用SRQ后,所有QP共享一个接收队列,显著降低内存占用。

实践建议:当每个节点QP数量超过64个时,强烈建议启用SRQ。在ibv_create_srq()中设置合理的max_wr(如4096),并确保每个QP的srq字段指向该SRQ。同时,CQ仍按QP独立创建,以便分别跟踪各QP的完成情况。

误区与复盘:常见配置错误

  • 误区1:将LID当作IP地址使用。LID仅在子网内有效,跨子网必须使用GID。配置路由时需同时考虑GID前缀。
  • 误区2:忽略SM的冗余配置。生产环境必须配置主备SM(如opensm的-B选项),否则SM故障会导致整个子网LID重新分配,所有QP连接中断。
  • 误区3:QP深度设置过大。虽然增大QP队列深度可提升吞吐,但会占用大量内存。建议发送队列深度为接收队列的2倍(如发送4096,接收2048),并配合SRQ使用。
  • 误区4:忘记检查端口状态。使用ibstat确认端口处于Active状态且速率正确(如400 Gb/s (HDR)),否则可能是线缆或交换机端口问题。
排障提示:当遇到“QP timeout”错误时,首先检查ibstat中端口是否Active,然后使用ibping测试LID连通性。若LID不通,检查SM是否运行(ps aux | grep opensm);若LID通但QP不通,重点检查QP状态机是否卡在INIT或RTR,并核对双方交换的QP编号与LID是否正确。