简介:这是 InfiniBand 架构规范卷一的 1.7 最终版官方 PDF,面向从事高性能计算、数据中心互联、存储网络与 RDMA 相关开发的工程师、架构师及研究员,用于查阅最新版协议定义、管理机制与新增特性。资源压缩包仅 1 个文件,为 13.82MB 的 PDF 文档,内容覆盖从 1.0 到 1.7 的完整修订历史,并包含 RoCE-v1/v2、虚拟化、网络探测(Network Probe)、XDR、MPE 等扩展附件,以及速率限制、最小带宽、VPort QoS 仲裁、内存放置扩展等细化机制。相比旧版本,1.7 还新增了网络探测 Annex A20,并为大规模 Radix 交换机在管理与子网管理章节补充了支持特性。目前已有 483 人学习,适合作为权威参考手册离线研读。借助该文档可系统把握 InfiniBand 最新架构演进方向、关键实现细节与兼容性要求,对协议开发、性能调优和存储网络方案设计均有直接帮助,可为后续研发与排错提供权威依据。
1. IB Specification Vol 1 Release 1.7:先搞懂这份规范在管什么,再谈 400G 组网
第一次拿到 400G 网卡却对端死活训练不过链路时,我才意识到 IB 规范版本更新不是改几个字而已。IB Specification Vol 1 Release 1.7 是 InfiniBand Trade Association 发布的卷一架构规范 1.7 最终版,落款 2023-07-11。它把 NDR 速率、链路层新特性和子网管理规则收进了正式标准,等于给 400G 时代的 IB 组网换了一版施工图。做 IB 组网的网络工程师、给智算或存储集群做选型的架构师、写驱动和一致性测试的协议开发,都会碰到它;新手也能靠它把 LID、VL、MTU 这些参数从“玄学”变成可查的定义。
2. 读规范前先拆结构:卷一管协议框架,1.7 的增量在三个地方
IB 规范不是打开就能从头读到尾的大部头。我拿到一份新版本,第一步永远是先看结构,再挑和当前项目实施相关的章节精读。卷一作为整个 IB 架构规范的核心分册,定义了链路层、网络层、传输层、子网管理、QoS 和性能管理的框架,是设备互操作的主要依据。物理层的信号参数通常以单独分册或专门章节给出,但卷一规定了物理层要对齐哪些能力、链路训练完成后要符合什么状态。所以实施 400G 组网时,先读卷一,再追物理层细节,顺序不能反。
2.1 IB 规范卷与卷的分工:为什么我建议先读卷一的中后部
IB 架构规范在从业者手里其实是按“需要时查”来用的。卷一的前面部分是通用术语、帧格式和分层模型,这部分适合通读一遍建立坐标系;真正决定组网成败的内容在中后部——链路层的流控机制、子网管理器(SM)的职责、路径计算规则、QoS 里的 SL 到 VL 映射,这些才是排障时会反复回翻的地方。
我自己的阅读习惯是先从目录里找三组关键词:Virtual Lane、Subnet Management、Link Layer。把这几章折出来,再去看附录里的词汇表。词汇表比正文更早暴露你对 IB 的理解盲区。比如很多人分不清 SL 和 VL,前者是报文头里的服务等级,后者是物理端口上的虚拟通道。一字之差,调 QoS 的时候完全在两个层面操作。卷一里这种成对概念非常多,漏一个后面全部理解都会歪掉。
另外要注意规范里的措辞强度。强制性条款和推荐性条款混在同一段落里,实施时先满足强制的,再决定要不要做推荐的。判断依据通常是句子里是否出现表示强制含义的动词。把推荐项当强制做,会白白浪费很多开发时间;把强制项漏掉,互操作测试一定挂。这算是我读 IB 规范最值得分享的一条经验。
2.2 从 1.6 到 1.7 的关键变化:NDR、链路层特性和管理面修订
Release 1.7 相对 1.6 的增量,最显眼的是 NDR 正式进入规范体系。NDR 代表每通道 100Gb/s 的速率档,四条通道聚合出 400Gb/s,调制方式从 EDR/HDR 时代的 NRZ 水平继续往前走,采用了 PAM4。这意味着链路预算、误码率目标、FEC 策略都要按新速率重新设计。1.6 时期 NDR 还只是厂商私有实现,到了 1.7 成为正式条款,第三方设备只要宣称支持 NDR,就必须按同一套能力协商流程来。
链路层的增量集中在拥塞控制和自适应路由相关定义上。之前版本里这些内容要么标注为可选项,要么只有框架没有操作细节;1.7 把产生拥塞时的标记规则、响应节点行为、自适应路由流量与普通流量之间的隔离要求写得更完整。管理面也有修订,主要体现在 SM 对端口能力发现流程上,NDR 端口上报的能力位比之前多,主备 SM 切换后的重配置流程也要重新匹配。
组网时怎么确认设备支持 1.7 定义的新特性?不能只看网卡型号。固件版本是关键,厂商发布说明里会写明固件基线对应哪个规范版本,设备管理工具里的 FW 版本号要能对上。驱动版本同样重要,尤其是支持 NDR 的网卡,驱动太旧可能连速率协商都会失败。
2.3 用三行命令核对硬件支持程度:固件版本与能力位
拿到一台设备和一根线缆,先别急着插上去,用主机侧工具把能力底牌翻出来。以下命令适用于常见的 IB 网卡设备,比如 Mellanox 系或 NVIDIA 系 HCA:
ibv_devinfo -v | grep -E 'hca_id|firmware|active_speed|ca_type' ibstat | grep -E 'State|Physical state|Rate|Firmware' ibv_devinfo -v | grep -E 'Port state|Active'第一条命令里的 active_speed 会显示当前协商出来的链路速率,看到 400Gb/s 或 NDR 字样才说明物理层工作在 1.7 定义的速率档。firmware 字段要和厂商 release notes 对照,确认固件基线覆盖 1.7 的修订日期。第三条命令的 Port state 显示 Active 只代表链路层起来了,不代表所有能力位都协商成功。
提示:速率显示 400Gb/s 但能力位不完整,通常出现在光模块或线缆固件偏旧时。报这种问题时,把 ibv_devinfo 完整输出和线缆 PN 一起贴给厂商,比只报“不通”有效得多。
这里要强调:ibv_devinfo看到的是设备能力,不是规范版本号。IB 设备不会直接告诉你“我支持 IB Spec 1.7”,而是通过能力位、速率档和协议字段的长度来体现。所以检查思路应该是:先确认速率档是 NDR,再确认相关的扩展能力位被置位,最后用互操作测试来兜底。
3. 物理层落地的关键参数:NDR 的 PAM4、RS-FEC 和链路训练
1.7 发布后,团队第一件事通常是验证 400G 链路能不能建连。物理层有两个大头:信号速率和调制方式决定链路预算,FEC 决定误码率能不能被压住。误码率不是玄学,来源就两个:时钟抖动 jitter 和信号质量 signal quality。PAM4 信号对这两个因素比 NRZ 敏感得多,这也是为什么同样长度和质量的线缆,HDR 能过训练,NDR 过不去的常见解释。
3.1 NDR 为什么比 HDR 难调:PAM4 与信号质量(jitter 是误码率的起点)
IB 速率档演进是一个典型的分水岭。早期 SDR、DDR、QDR 用的是 8b/10b 编码,FDR、EDR 切到 64b/66b,到了 HDR 和 NDR,调制方式变成 PAM4。PAM4 一个符号携带 2bit,眼图从单眼变成三眼,相邻电平之间的电压差更小,对噪声、反射和串扰的容忍度明显下降。
链路预算不够时,最典型的表现是链路训练能过,但长时间跑流量后 symbol error 计数持续上涨。这种错误不会立刻把链路打 Down,而是表现为 RDMA 重传增多、带宽抖动。检查时先看端口的 symbol error counter,再对照 jitter 相关指标——如果设备支持眼图测量,看眼高和眼宽是否有余量。信号质量差的链路,眼图闭合度会很明显。
实施层面要注意:PAM4 对无源铜缆的长度很敏感。同样是 DAC 线,HDR 时代 2 米没问题,NDR 可能 1.5 米就是极限。选线时不要只看接口形状一样就下单,要查线缆标称的支持速率和插入损耗规范。标记支持 400G DAC 的线缆,2 米档和 1.5 米档的链路预算差别很大。
3.2 调 FEC 只有一个参数:RS(544,514),但两端必须一致
NDR 和 HDR 链路用的 FEC 是 RS(544,514),属于 Reed-Solomon 码族,514 个数据符号加上 30 个校验符号组成一个码块,能纠正 8 个符号错误。这个参数在实施时通常不需要自己算,但要清楚两件事:FEC 模式必须在链路两端一致,以及 FEC 开启后有效带宽会有一点开销。
常见做法是用厂商自带的链路诊断工具查 FEC 模式。以 Mellanox 系设备为例,命令大致是这样的:
mlxlink -d mlx5_0 -c | grep -E 'FEC|Rate|Media' ibportstate -d mlx5_0 -n 1 -q 1第一条命令查看当前端口协商出的 FEC 模式,RS(544,514) 字样会直接显示出来。第二条命令把端口重新训练一次,适合改了配置后重新拉起链路。
参数配置上最容易踩的坑是:两端 FEC 模式不一致,链路会反复训练失败,或者训练成功但误码率异常。某些交换机默认把 FEC 设成 None,主机侧网卡默认 Auto,结果协商不出来。处理办法是两端都显式指定为 RS(544,514),或者都走 Auto 协商。不要一端 Auto 另一端固定,这种半自动状态在 NDR 速率下成功率很不稳定。
3.3 DAC、AOC 和光模块怎么选:先看链路预算,别只看接口
400G 端口的物理介质选择,常见三类:无源 DAC(Direct Attach Copper)、有源光缆 AOC、可插拔光模块加光纤。DAC 便宜省电,但受链路预算限制,距离很短;AOC 两头是光模块,中间光纤,距离可以做长;光模块加光纤最灵活,但要额外考虑光纤类型和跳线质量。
选型判断依据不是经验值,而是模块和线缆 datasheet 里的插入损耗(IL)、回波损耗(RL)指标。NDR 的 PAM4 信号对这两个参数更敏感。有些工程师习惯“短距离就 DAC,长距离就光模块”,在 400G 时代这个经验需要修正——同一长度下,DAC 的质量差异可能决定训练能不能通过。
实操建议是建立一份选型表,按距离区间列出可用介质和典型损耗预算,再标注厂商兼容矩阵的版本。兼容矩阵不是一成不变的,设备厂商会在新固件里调整对第三方线缆的兼容策略。之前遇到一个案例:同一根 AOC,交换机升完固件后从 400G 协商掉到 200G,查兼容矩阵才发现线缆 PN 没在最新支持列表里。所以别嫌麻烦,选型表里一定要带固件版本号和测试日期。
3.4 链路训练失败的查法:两个状态字段和一条命令
链路训练失败时,端口状态会卡在初始化阶段。排查思路按层级来:物理层先确认信号有没有上来,再确认链路层状态机走没走到 Active。以下是常用检查命令:
ibstat -p ibstat -c | grep -i -E 'symbols|link_error|recover'第一行输出端口物理状态和链路状态,第二行抓错误计数器。如果 symbol error 计数不为零且持续增长,问题大概率在物理层信号质量;如果计数器全零但状态不到 Active,问题可能在能力协商或 FEC 模式不匹配。
链路训练是一个分阶段的状态机,卡在哪一步会体现在端口状态字段里。常见的卡点有三个:等待物理信号稳定、等待对方能力位交换、等待 FEC 参数确认。排查时把两端端口的输出放在一起对比,哪个字段不对称就是突破点。比如一端显示 FEC 为 RS(544,514),另一端显示 None,问题就很明确。
这里有一条经验:链路训练失败后的重试间隔有时会达到几十秒,改完配置不要急着抓日志,等一轮完整的重训周期再做判断。我就犯过这种错,改完 FEC 后十几秒没起来就判定失败,实际再过二十秒链路自己就上来了。
4. 链路层与子网管理:卷一里真正决定“通不通”的那几页
物理层把信号抬起来之后,链路层负责把数据送对地方。Vol 1 的链路层章节定义了报文头格式、流控机制和虚拟通道规则,子网管理章节则规定了路径怎么算、地址怎么分。很多组网问题表面看是物理层,实际都出在这一层——地址分配冲突、路径计算不一致、VL 规划不合理,链路状态全 Active 但业务就是不顺。
4.1 LID、SL、VL、MTU:四个字段决定数据往哪走
链路层里最常被问的四个字段是 LID、SL、VL、MTU。LID 是子网内地址,类似二层地址,由子网管理器 SM 统一分配,主机侧和交换机侧每个端口都有一个。SL 是报文头里的服务等级字段,占 4bit,取值范围 0-15,用来表达优先级和 QoS 等级。VL 是端口上的虚拟通道,范围 0-15,VL15 专门给子网管理报文用。MTU 是最大传输单元,IB 的 MTU 取值为 256、512、1024、2048、4096 这几档。
容易混淆的是 SL 和 VL 的关系。SL 在报文里,VL 在物理端口上。报文进入交换机后,交换机会根据 SL 到 VL 的映射表决定从哪个虚拟通道走。这张映射表由 SM 计算并下发。所以 SL 和 VL 不是一回事,但通过映射表关联在一起。调试 QoS 问题时,两边都要看。
MTU 的坑更隐蔽。IB 的 MTU 协商不是每跳独立,而是由 SM 在路径计算时统一决定,通常取路径上所有端口的最小值。如果主机配置文件把 MTU 设成 4096,交换机侧某个端口只有 2048,SM 会按 2048 下发,但主机驱动仍按 4096 发包,就会产生分片或丢弃。排查这类问题,靠 ping 测不出来,要看计数器里的丢包统计。
4.2 SM 怎么算路径:主备切换为什么会有收敛窗口
子网管理器是 IB 子网的“大脑”。它负责给所有端口分配 LID,计算任意两个端节点之间的路径,生成交换机的转发表,并维护 SL 到 VL 的映射。卷一对 SM 的行为定义非常细,因为多厂商设备要在同一个子网里互操作,路径计算规则不一致就直接出问题。
生产环境里 SM 通常做主备部署。master SM 负责实际计算和下发表项,standby SM 监听状态。master 故障后,standby 要经历一个“接管-扫描-重算”的过程:先确认自己成为 master,再重新发现整个子网拓扑,然后重新分配 LID 和计算路径。这个收敛窗口期间,部分主机可能暂时无法通信。
收敛窗口的长短取决于子网规模和 SM 实现。几十个端节点的小子网通常秒级收敛,上千端节点的子网可能要几十秒。优化手段是把 SM 的心跳间隔调短,让 standby 更快感知 master 故障;但心跳太短会增加管理报文开销,需要权衡。
实操上要注意:SM 主备切换后,主机侧缓存的路径信息可能过期。必要时重启端节点的驱动或清一下 ARP 缓存。一个常见现象是 SM 已经收敛完,但某台主机还在往旧 LID 发包,表现为只有个别节点不通。
4.3 流控与死锁:VL 规划比想象中重要
IB 的流控是基于信用(credit)的机制。发送端必须收到接收端返回的信用才能继续发数据,没有信用就停下来等。这种机制能防止丢包,但也带来了新的问题——如果流量形成环路且所有缓冲区被占满,就会出现死锁,谁都等不到信用。
VL 的作用之一就是打破死锁。把不同方向的流量放到不同 VL 上,即使某个方向的缓冲区满了,另一个方向仍能继续流动。卷一对 VL 的规划建议是:把存储流量、IPC 流量和管理流量分开,VL15 永远留给 SM 报文,数据流量不要占用。
组网规划时,我一般会给每个业务一个专属 SL,再映射到对应 VL。比如 SL0 映射 VL0 跑存储同步,SL1 映射 VL1 跑管理面,SL15 映射 VL15 给 SM。这样当某个 VL 出现拥塞时,其他业务不受影响。这个规划在 1.7 下显得更重要,因为自适应路由流量如果和普通流量混在同一个 VL,出现乱序或拥塞时很难定位。
4.4 用 ibdiagnet 扫子网:哪些输出值得逐行看
验证一个子网配置是否合理,最直接的办法是用 ibdiagnet 做一次全子网扫描。这个工具会连到子网里的 SM,拉取拓扑、路由表和端口属性,做一致性检查。常用命令和参数如下:
ibdiagnet -c -r -l -o /tmp/ibdiag参数含义:-c做一致性检查,-rdump 路由表,-l输出链路信息,-o把结果写到指定目录。扫描结束后,重点看输出目录里的 Warnings 和 Errors 部分,以及端口状态汇总。MTU 不一致、LID 冲突、SL 映射缺失都会在这里被标出来。
扫描输出里最常见的告警是端口速率不匹配和 MTU 不匹配。速率不匹配通常出现在新旧设备混布时,MTU 不匹配则说明某个端口的配置和路径计算不一致。处理顺序是:先修 MTU,再查速率,最后看路由表是否有黑洞——即有 LID 分配了但没有任何路径可达。
提示:ibdiagnet 跑完以后,如果输出目录里的路由表文件特别大,不要直接打开。用 grep 按 LID 或端口号过滤,比整个人肉翻快得多。
5. 避坑:Release 1.7 组网最常翻车的 5 个场景
1.7 带来的不只是新速率,还有新的坑。以下 5 个场景来自我做 IB 组网的血泪经验,前两个和物理层相关,后三个和配置管理相关。每条按现象、原因、解决来说,希望能帮你少走几百公里的弯路。
5.1 光模块标着支持 NDR,却协商回 HDR
现象:400G 光模块插上去,端口状态 Active,但速率协商成 200G,重训多次仍回不去。
原因有两个。一是光模块固件版本太旧,能力位里没有把 NDR 置上,设备只认到 HDR。二是线缆或模块的模拟前端指标没达到 NDR 的链路预算,训练过程中眼图质量不过关,自动降级到 HDR。
解决:先把模块固件升级到厂商最新版本,确认支持矩阵里对该 PN 有 NDR 的记录。如果固件已最新,换一根更短或质量更好的线缆做 A/B 测试。直接改强制速率档不推荐,PAM4 下强制速率档往往会掩盖信号质量问题,后面误码率会自己暴露出来。
5.2 端口全 Active,IB 写带宽只有预期的一半
现象:所有端口都是 Active,ibstat 显示速率 400G,但 perftest 跑出来只有 200G 左右。
原因:最常见是 MTU 不一致。发送端按 4096 发包,路径上某个端口被 SM 压到 2048,导致报文被拆或丢弃,重传吃掉大量带宽。另一个常见原因是 PCIe 带宽不足,400G 网卡需要 PCIe Gen4 x16 才能跑满,如果插在 x8 槽位上,理论带宽直接砍半。
解决:先用ibdiagnet -c检查整条路径的 MTU 汇总,把所有端口统一到同一档。再执行lspci -vvv看网卡所在 PCIe 插槽的 LnkSta 字段,确认速率和宽度。两个检查都做完,再跑 perftest,问题通常会水落石出。
5.3 SM 主备切换后,部分主机业务中断超过预期
现象:master SM 所在设备重启,业务中断时间远大于正常收敛时间,个别主机在 SM 切换完成后仍然无法通信。
原因:standby 接管后需要重新扫描整个子网并计算路径,这个收敛窗口内部分转发表项还没下发。更糟的是主机侧缓存了旧的 LID 到 GID 的映射,SM 重算路径后映射变了,主机还在往旧地址发包。
解决:先给 SM 接管留出完整的收敛时间,不要在主备切换期间反复触发其他配置变更。再检查主机的 ARP 缓存或路径缓存,必要时卸载并重新加载驱动。生产环境建议把 SM 的接管优先级配置好,并提前测一次故障演练,知道实际收敛时间是多少,避免上线后第一次切换直接超时。
5.4 同型号光模块,两个机房误码率天差地别
现象:同一批模块、同型号交换机,A 机房跑到 400G 很稳,B 机房 symbol error 计数持续上涨,带宽不稳定。
原因:B 机房的光纤跳线质量或弯曲半径不达标。PAM4 信号对回波损耗和插入损耗比 NRZ 敏感得多,光纤拐弯太急、跳线端面脏污都会直接体现在误码率上。jitter 和 signal quality 是两个直接相关的指标。
解决:先清洁光纤端面,检查弯曲半径是否符合线缆规范。然后用设备自带的诊断工具对比两个机房端口的眼图参数,看眼高和眼宽有没有明显差别。通常换一根短一点、质量好一点的跳线就能解决。这个场景最能体现 400G 时代“物理层问题都是细节问题”的特点。
5.5 速率显示 400G,perftest 却只跑出单通道带宽
现象:链路协商是 400G,但测带宽只有 100G 左右,像是只有一条通道在工作。
原因:部分网卡支持把 400G 端口拆分成多个独立端口使用,配置工具里如果没有正确合并通道,流量只会走其中一个物理通道。另一个原因是 PCIe 链路只训练到 x8,带宽上限卡住。
解决:检查网卡配置工具里的端口拆分设置,确认端口处于非拆分模式,四条通道都聚合在一起。同时确认 PCIe 链路宽度是 x16。这类问题往往在装机阶段埋下,一个分区脚本写错,后面排查要花很久。
6. 用三组命令验证 NDR 生效:从设备能力到实际带宽
部署完一套 IB 1.7 网络,验证不能只看链路 Active。我自己的验证顺序是:先确认设备能力,再扫子网一致性,最后跑实际带宽测试。三组命令对应三个层次,缺一不可。
第一组命令确认设备能力和当前链路状态:
ibv_devinfo -v | grep -i -E 'active_speed|firmware|port_state' ibstat -p预期结果:active_speed 显示 400Gb/s 或 NDR,端口物理状态和链路状态都是 Active。如果看到 200Gb/s 或 Lower,说明协商没到顶,回到上一节的排查路径。
第二组命令用 ibdiagnet 做全子网一致性检查:
ibdiagnet -c -o /tmp/ibdiag_verify grep -i -E 'warning|error|mismatch' /tmp/ibdiag_verify/*.txt预期结果:没有任何 error,warning 数量少且可以解释。如果出现 MTU mismatch 或速率不匹配,直接定位到具体端口修掉。
第三组命令用 perftest 测实际带宽:
ib_read_bw -a -d mlx5_0 ib_write_bw -a -d mlx5_0预期结果:read 和 write 都接近 400Gb/s 的理论带宽,偏差超过 10% 就要回头查 PCIe 或 MTU。
我自己的习惯是每次版本升级后,先把错误计数清零,再按这个顺序跑一遍。这样得到的数据干净,能对比出固件升级前后有没有引入新问题。这套顺序是这几年做 IB 组网最省时间的验证方式,希望帮到你。
本文还有配套的精品资源,点击获取