2. InfiniBand基础概念
2.1 什么是InfiniBand:从I/O总线到网络架构的演进
InfiniBand(简称IB)最初并非作为一种“网络”被设计,而是作为服务器内部I/O总线(如PCI、PCI-X)的替代方案,解决CPU与外部设备之间日益增长的带宽瓶颈。随着技术演进,它逐渐从机箱内部的总线形态,发展为一种面向高性能计算(HPC)和企业级数据中心的网络互连架构。理解这一历史脉络,有助于解释IB中许多看似“奇怪”的设计——例如它为何同时具备内存语义和网络语义。
从协议栈角度看,InfiniBand与TCP/IP有着本质差异。TCP/IP是软件协议栈,依赖操作系统内核进行数据封装、路由和流量控制,CPU开销大;而InfiniBand将大部分传输层功能卸载到硬件网卡(HCA,Host Channel Adapter)上,实现内核旁路(Kernel Bypass)和零拷贝(Zero-Copy)传输。这意味着应用可以直接与网卡交换数据,无需经过内核缓冲区,从而显著降低延迟和CPU占用。
核心要点:InfiniBand不是“更快的以太网”,而是一套完整的、面向低延迟和高吞吐设计的互连体系。它同时支持通道I/O(Channel I/O)和内存语义(RDMA),允许一台服务器的应用直接读写另一台服务器的内存区域,而无需双方CPU参与数据搬运。
2.2 InfiniBand与传统以太网的关键区别
要真正理解IB的价值,需要从多个维度对比它与传统以太网的差异。以下表格总结了最核心的区别点:
| 对比维度 | 传统以太网 | InfiniBand |
|---|---|---|
| 通信语义 | 基于消息(Packet),需IP+TCP/UDP封装 | 支持通道语义与内存语义(RDMA读写) |
| 数据路径 | 经过内核协议栈,CPU参与拷贝 | 硬件卸载,内核旁路,零拷贝 |
| 典型延迟 | 10~100μs(受软件栈影响大) | 0.5~2μs(节点间) |
| 流控机制 | 丢包后TCP重传(端到端) | 链路级流控(基于信用),几乎不丢包 |
| 网络管理 | 分布式,无集中管理实体 | 集中式子网管理器(SM) |
| 寻址方式 | IP地址(32/128位)+ MAC地址 | LID(16位,子网内)+ GID(128位,跨子网) |
| 可靠性 | 依赖TCP保证可靠传输 | 硬件级可靠传输(可选可靠连接RC) |
实践提示:在规划数据中心网络时,不要将IB视为“替换以太网”的方案,而应将其定位为面向特定工作负载(如MPI并行计算、分布式存储、AI训练)的专用加速网络。通常IB与以太网共存:IB承载东西向高速流量,以太网承载管理、存储和南北向业务。
2.3 关键术语详解:SM、LID、GID与QPN
IB网络拥有一套独特的寻址和管理体系,理解以下术语是掌握IB运维的基础。
2.3.1 子网管理器(SM,Subnet Manager)
IB子网是集中管理的网络域。子网管理器是运行在指定节点(通常是交换机或专用服务器)上的软件实体,负责整个子网的初始化、配置、监控和故障恢复。SM的主要职责包括:
- 发现拓扑:通过SMP(子网管理包)探测所有交换机、HCA和链路。
- 分配LID:为每个端口分配唯一的16位本地标识符。
- 计算路由:生成转发数据库,下发到各交换机。
- 监控状态:持续跟踪链路状态变化,触发重配置。
一个子网内可以有多个SM(主/备模式),但同一时刻只有一个主SM(Master SM)处于活动状态。SM的故障切换机制是IB高可用性的重要保障。
2.3.2 LID(Local Identifier,本地标识符)
LID是IB子网内端口级的16位地址,范围从0x0001到0xBFFF(保留部分特殊用途)。每个IB端口至少有一个LID,也可以拥有多个(用于多路径)。LID仅在子网内有效,类似于以太网中的MAC地址,但由SM统一分配而非厂商烧录。数据包在子网内转发时,交换机依据DLID(目的LID)进行路由决策。
2.3.3 GID(Global Identifier,全局标识符)
GID是128位地址,用于跨子网通信。GID由64位子网前缀(Subnet Prefix)+ 64位端口GUID(Global Unique Identifier)组成。端口GUID由厂商烧录,全球唯一;子网前缀由SM配置。GID的格式与IPv6地址类似,通常写作十六进制冒号分隔形式,例如:
fe80:0000:0000:0000:0002:c903:00a5:4b01
其中fe80开头的为链路本地GID,类似于IPv6的链路本地地址。
2.3.4 QPN(Queue Pair Number,队列对编号)
QPN是HCA内部为每个队列对(QP)分配的编号,用于标识通信端点。一个QP由本地QPN + 目的LID/GID + 目的QPN共同构成通信的“四元组”。QP是IB通信的基本单元,类似于TCP中的Socket。
类比记忆:如果把IB子网比作一座城市,那么LID就是城市内的门牌号(子网内唯一),GID就是“国家+城市+门牌号”的完整地址(全球唯一),QPN则是楼内的房间号(区分同一端口上的不同通信流)。而SM则是城市管理局,负责分配门牌号并维护交通路线。
2.4 实际案例:查看IB网络中的地址信息
在Linux服务器上,我们可以使用ibstat和ibv_devinfo命令查看实际的IB端口信息。以下是一个典型输出示例:
$ ibstat
CA 'mlx5_0'
CA type: MT4123
Number of ports: 1
Firmware version: 20.29.1002
Hardware version: 0
Node GUID: 0x248a070300b4c5a0
System image GUID: 0x248a070300b4c5a3
Port 1:
State: Active
Physical state: LinkUp
Rate: 200 (FDR10)
Base lid: 0x2c
LMC: 0
LID mask control: 0x0
SM lid: 0x1
SM sl: 0
Capability mask: 0x2651e848
Port GUID: 0x248a070300b4c5a1
Port LID: 0x2c
Port LMC: 0
关键信息解读:
- Base lid: 0x2c —— 该端口的主LID为44(十进制),子网内通信使用此地址。
- SM lid: 0x1 —— 当前主SM的LID为1,通常SM位于交换机上。
- Port GUID: 0x248a070300b4c5a1 —— 端口全局唯一标识,用于生成GID。
- Rate: 200 (FDR10) —— 当前链路速率为FDR10(约10Gbps/lane × 4 = 40Gbps有效)。
查看GID信息可使用ibv_devinfo -v或show_gids命令:
$ show_gids
DEV PORT INDEX GID IPv6 VER DEV
mlx5_0 1 0 fe80:0000:0000:0000:248a:0703:00b4:c5a1 fe80::248a:703:ff:feb4:c5a1 v2 physical
mlx5_0 1 1 fe80:0000:0000:0000:248a:0703:00b4:c5a1 fe80::248a:703:ff:feb4:c5a1 v1 physical
可以看到,GID的低64位正是端口GUID,高64位为子网前缀(此处为fe80::/64的链路本地前缀)。
2.5 常见误区与复盘
误区一:认为IB只是“更快的以太网”。实际上,IB的架构设计与以太网截然不同。IB采用集中管理、链路级流控和硬件卸载,而以太网是分布式、尽力而为的模型。将IB当作以太网来运维(例如手动配置IP、依赖TCP重传)会完全丧失其性能优势。
误区二:混淆LID和GID的使用场景。LID仅在子网内有效,跨子网通信必须使用GID。在配置路由或跨子网通信时,如果错误地使用LID作为目的地址,数据包将无法被正确转发。实践中,ibping等工具默认使用LID测试,而RDMA通信(如rping)通常需要指定GID。
误区三:忽略SM的重要性。有些管理员认为IB交换机“即插即用”,不需要关注SM。实际上,没有SM运行,IB交换机端口将无法获得LID,链路状态会停留在“Initializing”而非“Active”。在部署IB网络时,必须确保至少有一个SM在运行,并配置主备SM实现高可用。
复盘要点:在IB网络排障时,建议按照以下顺序检查:
- 物理层:使用
ibstat确认端口状态为Active、物理状态为LinkUp。 - SM状态:确认SM正在运行(
smquery或ibdiagnet),且主SM的LID可达。 - LID分配:确认本端与对端均已获得有效的LID(非0x0000)。
- 连通性测试:使用
ibping验证LID层连通性,再使用rping或ib_write_bw验证RDMA层通信。
通过以上对IB基础概念的梳理,可以看到IB并非简单的网络技术,而是一套完整的、面向极致性能的互连架构。掌握SM、LID、GID等核心术语,理解其与传统以太网的架构差异,是后续学习IB组网、路由配置和性能调优的基石。在实际部署中,务必牢记IB的集中管理特性,并善用ibstat、ibv_devinfo等工具进行状态验证。