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参与数据搬运。

传统以太网(TCP/IP路径) 应用(Socket API) 内核TCP/IP协议栈 封装/路由/拥塞控制 CPU参与数据拷贝 网卡驱动 以太网卡(NIC) 延迟:10~100μs CPU占用高 InfiniBand(RDMA路径) 应用(Verbs API / RDMA) 用户态驱动(libibverbs) 内核旁路,直接访问HCA HCA硬件卸载 传输层/网络层/链路层 零拷贝 + 硬件重传 IB交换机(子网内转发) 延迟:0.5~2μs CPU几乎零参与 关键差异:IB将传输层卸载至硬件,实现内核旁路与零拷贝,延迟降低约一个数量级

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网络排障时,建议按照以下顺序检查:

  1. 物理层:使用ibstat确认端口状态为Active、物理状态为LinkUp。
  2. SM状态:确认SM正在运行(smquery或ibdiagnet),且主SM的LID可达。
  3. LID分配:确认本端与对端均已获得有效的LID(非0x0000)。
  4. 连通性测试:使用ibping验证LID层连通性,再使用rping或ib_write_bw验证RDMA层通信。

通过以上对IB基础概念的梳理,可以看到IB并非简单的网络技术,而是一套完整的、面向极致性能的互连架构。掌握SM、LID、GID等核心术语,理解其与传统以太网的架构差异,是后续学习IB组网、路由配置和性能调优的基石。在实际部署中,务必牢记IB的集中管理特性,并善用ibstat、ibv_devinfo等工具进行状态验证。