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栈参数。
关键概念详解:从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)自动完成,但理解其底层逻辑有助于排查“连接超时”类问题。
- 初始化:HCA驱动加载,SM发现端口并分配LID。
- 创建QP:调用
ibv_create_qp(),指定发送/接收队列深度、最大SGE数等参数。 - 状态迁移:QP从
RESET→INIT→RTR(Ready to Receive)→RTS(Ready to Send)。 - 交换信息:通过带外通道(如TCP)交换QP编号、LID、GID等信息。
- Post Send/Recv:调用
ibv_post_send()和ibv_post_recv()提交工作请求(WR)。 - 完成通知:操作完成后,完成队列(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是否正确。