第4章:InfiniBand协议栈详解
聊到InfiniBand,很多人第一反应就是「高速网络」。但说实话,真正理解它协议栈的人并不多。我见过不少工程师,配置IB网络时全靠复制粘贴,出了问题就抓瞎。这一章,咱们就把IB的协议栈一层层剥开来看。
InfiniBand的协议栈,其实和OSI模型有点像,但又不完全一样。它分了物理层、链路层、网络层、传输层,再加上一堆上层协议。嗯,咱们一层层说。
4.1 物理层:信号怎么跑起来的
物理层,说白了就是线缆和信号的事儿。IB的物理层定义了电气特性、连接器类型、信号速率这些基础参数。
我个人习惯把物理层分成两块来看:
- 电气子层:负责信号的编码、解码、时钟恢复
- 连接子层:定义端口类型、链路宽度、热插拔这些
IB的物理层支持多种速率,从最早的SDR(2.5Gbps)到现在的NDR(400Gbps),演进速度相当快。我在项目中遇到过最坑的事,就是混用不同代的光模块——明明接口一样,但速率协商失败,链路死活起不来。
关键参数速查表:
| 代际 | 单通道速率 | 4x总带宽 | 典型应用 |
|---|---|---|---|
| SDR | 2.5 Gbps | 10 Gbps | 早期HPC |
| DDR | 5 Gbps | 20 Gbps | 旧集群 |
| QDR | 10 Gbps | 40 Gbps | 主流方案 |
| FDR | 14.0625 Gbps | 56.25 Gbps | 高性能场景 |
| EDR | 25 Gbps | 100 Gbps | AI训练集群 |
| HDR | 50 Gbps | 200 Gbps | 最新数据中心 |
| NDR | 100 Gbps | 400 Gbps | 前沿超算 |
我的经验:选型时别只看单端口速率。链路宽度(1x、4x、8x、12x)同样重要。4x是最常见的,但如果你需要超高带宽,12x直连能省不少交换机端口。
4.2 链路层:数据怎么可靠传输
链路层,这是IB协议栈里最核心的一层。它负责把物理层传来的比特流组织成数据包,还要保证传输的可靠性。
链路层主要干这几件事:
- 数据包封装:把上层数据加上头部和CRC
- 流控机制:基于信用的流控,防止发送方淹没接收方
- 错误检测:VCRC(变长CRC)和ICRC(不变CRC)双重校验
- 链路初始化:端口训练、链路宽度协商
你想想看,为什么IB能做到那么低的延迟?其中一个秘密就在链路层的流控机制。它用的是基于信用的流控,而不是传统的停等协议。发送方知道接收方有多少缓冲区可用,可以连续发送多个包,不用等ACK回来再发下一个。
IB数据包结构(链路层视角):
+----------------+----------------+----------------+----------------+
| LRH (8字节) | GRH (40字节) | BTH (12字节) | Payload |
| 本地路由头 | 全局路由头 | 基本传输头 | 数据负载 |
+----------------+----------------+----------------+----------------+
| ETH (4-8字节) | Payload | ICRC (4字节) | VCRC (2字节) |
| 扩展传输头 | 继续... | 不变CRC | 变长CRC |
+----------------+----------------+----------------+----------------+
我曾经调试过一个诡异的丢包问题。所有链路状态都显示正常,但跑MPI程序就是会卡死。查了三天,最后发现是某根线缆的VCRC校验偶尔失败——物理层没报错,但链路层默默丢了包。嗯,从那以后我养成了习惯,任何IB链路调试都先看端口计数器的VCRC错误。
4.3 网络层:数据怎么找到路
网络层,负责路由和寻址。IB的网络层比以太网简单,但设计得很精巧。
IB的寻址分两级:
- LID(本地标识符):16位地址,子网内唯一
- GID(全局标识符):128位地址,基于IPv6格式,全局唯一
说白了,LID就像你小区里的门牌号,GID就像你的身份证号。在同一个子网里通信,用LID就够了。跨子网通信,才需要GID。
IB的路由算法主要有两种:
- DOR(维度顺序路由):简单高效,适合胖树拓扑
- 自适应路由:动态选择路径,避免拥塞
避坑指南:我曾经在一个2000节点的集群上,用了默认的DOR路由。结果某个链路故障后,流量全部挤到另一条链路上,整个集群性能暴跌。后来改用了自适应路由,配合OpenSM的故障切换策略,才解决了这个问题。记住,大集群一定要做路由冗余规划。
4.4 传输层:数据怎么可靠交付
传输层,这是IB协议栈里最灵活的一层。它定义了多种传输服务类型,满足不同场景的需求。
IB的传输服务分这么几类:
| 服务类型 | 可靠性 | 连接方式 | 典型用途 |
|---|---|---|---|
| RC(可靠连接) | 可靠 | 点对点 | MPI通信、存储访问 |
| UC(不可靠连接) | 不可靠 | 点对点 | 视频流、实时数据 |
| RD(可靠数据报) | 可靠 | 多对多 | 集群管理、广播 |
| UD(不可靠数据报) | 不可靠 | 多对多 | 控制消息、管理报文 |
| XRC(扩展可靠连接) | 可靠 | 多对多 | 大规模MPI优化 |
你可能会问,为什么要有这么多类型?其实原因很简单——不同应用对延迟、吞吐量、可靠性的要求不一样。比如MPI计算任务,必须用RC保证数据不丢;但监控系统发个心跳包,用UD就够了,丢了也无所谓。
我记得有一次帮客户优化AI训练集群,他们所有通信都用RC,结果连接数爆炸——每个GPU对都要建一条RC连接,1000张卡就是近50万条连接。后来改成XRC,连接数直接降到几千条,性能还提升了15%。
4.5 上层协议:IB怎么服务应用
上层协议,这是IB和实际应用之间的桥梁。IB本身只是个传输管道,真正让应用跑起来的,是这些上层协议。
4.5.1 IPoIB:在IB上跑IP
IPoIB(IP over InfiniBand),说白了就是把IB网络伪装成以太网,让传统IP应用能跑在IB上。
IPoIB有两种模式:
- Datagram模式:基于UD传输,MTU约4KB
- Connected模式:基于RC传输,MTU可达2MB
我个人建议,能跑Connected模式就别用Datagram。虽然Connected模式消耗更多内存,但大MTU带来的吞吐量提升非常明显。我在一个文件服务器上做过测试,Connected模式比Datagram模式吞吐量高了30%。
注意:IPoIB的ARP是特殊实现的,叫「IPoIB ARP」。如果你在IB网络上抓包,用Wireshark看ARP请求,会发现格式和以太网完全不同。别拿以太网的思路去分析IB的ARP,我见过有人在这上面浪费了一整天。
4.5.2 SRP:存储访问的利器
SRP(SCSI RDMA Protocol),让IB网络可以直接访问远程存储设备。它把SCSI命令封装在RDMA操作里,实现了低延迟的存储访问。
SRP的工作流程大致是这样:
- Initiator(发起端)通过IB连接Target(目标端)
- Target暴露存储设备,Initiator发现并映射
- 应用层发SCSI命令,SRP层将其转为RDMA操作
- 数据通过RDMA直接读写,不经过CPU拷贝
我在搭建分布式存储集群时,对比过iSCSI和SRP。同样跑4K随机读写,SRP的延迟只有iSCSI的1/5,IOPS高出4倍。当然,SRP的配置比iSCSI复杂得多,需要IB子网管理器配合。
4.5.3 iSER:iSCSI的RDMA升级版
iSER(iSCSI Extensions for RDMA),是iSCSI的RDMA增强版。它保留了iSCSI的协议框架,但把数据传输部分换成了RDMA。
iSER的优势很明显:
- 兼容现有iSCSI管理工具
- 零拷贝数据传输
- CPU卸载,降低主机负载
但要注意,iSER需要网卡和驱动都支持。我遇到过一台服务器,操作系统版本太老,iSER驱动死活装不上。最后只能降级用普通iSCSI,性能差了一大截。
4.5.4 其他上层协议
除了上面几个,IB还支持一堆其他上层协议:
- MPI:消息传递接口,HPC的标配
- NVMe over Fabrics:NVMe存储的RDMA访问
- RDS:可靠数据报服务,Oracle数据库在用
- DAPL:直接访问编程库,底层RDMA的抽象接口
我的建议:如果你是刚开始接触IB,先搞懂RC和UD这两种传输服务。然后从IPoIB入手,让传统应用先跑起来。等熟悉了,再尝试SRP或iSER做存储。别一上来就搞MPI优化,那玩意儿坑太多。
4.6 协议栈的协同工作
说了这么多层,它们到底怎么配合的?我画个简单的数据流:
应用层 (MPI/存储应用)
↓ 上层协议 (IPoIB/SRP/iSER)
传输层 (RC/UD/UC/RD)
↓ 数据分段 + 传输头
网络层 (LID/GID路由)
↓ 路由头 + 转发决策
链路层 (包封装 + 流控)
↓ CRC + 信用控制
物理层 (信号编码 + 线缆传输)
数据从上往下走,每层加自己的头部信息。到了接收端,从下往上走,每层剥掉对应的头部。这个过程叫「分层封装」,和TCP/IP的思路是一样的。
但IB有个独特的设计——RDMA(远程直接内存访问)。它允许应用层数据直接通过硬件传输,绕过操作系统内核。这就是IB延迟低的根本原因。你想想看,传统网络发一个数据包,要经过用户态→内核态→网卡驱动→硬件,来回好几趟。IB的RDMA直接让应用和网卡硬件对话,省掉了中间所有开销。
调试小技巧:当IB链路出问题时,别急着看应用日志。先查物理层(光功率、信号质量),再看链路层(CRC错误、链路状态),然后看网络层(路由表、LID分配),最后才查传输层和上层协议。按这个顺序排查,能省你80%的调试时间。
好了,这一章的内容就到这儿。协议栈是IB的骨架,理解了它,后面讲配置、调优、排错就轻松多了。下一章,咱们聊聊IB子网管理器——这个让整个IB网络运转起来的「大脑」。