简介:《InfiniBand架构规范 第1卷 1.4版》是2020年由InfiniBand贸易协会发布的官方标准文档,聚焦数据中心、高性能计算与RoCE网络场景,面向需要理解IB基础架构与RDMA实现的网络工程师、协议研究者和开发者。文档包含完整规范正文,在第一章概述技术设计目标、HCA/CA、交换机与串行连接等基本组件;随后各章系统讲解传输协议、服务质量、错误处理、连接管理、QP/CQ、路由以及物理层与链路层规范,并梳理了从1.0到1.4的版本演进,便于对照历史修订。针对融合以太网,规范特别收录RoCE-v1与RoCE-v2附录,说明无损以太网要求、IPv4/IPv6支持与更灵活的网络配置。资源为单个PDF文件,大小12.64MB,适合离线查阅,目前已有2854人学习,是深入掌握InfiniBand技术体系和网络实践要点的权威参考资料。无论用于学习还是工程参考,均能提供清晰权威的依据。
1. 读懂 IB Specification Vol 1-Release-1.4.pdf:这份文档到底管什么
IB Specification Vol 1-Release-1.4.pdf 是 InfiniBand 工程师绕不开的一份正文,IBTA 发布的这一卷把链路层、网络层、传输层和子网管理的行为全部写成了条款。对做 HPC、存储网络和 RDMA 加速的人来说,它一半是字典、一半是边界:字典告诉你 QP 状态机每一步怎么走,边界告诉你为什么 4x 的线速永远不等于应用能拿到的带宽。
我见过太多人把这份 PDF 丢进收藏夹吃灰,出了问题就靠 ibstat 的输出猜。猜一两次还能蒙对,遇到 MTU 不一致、P_Key 隔离、QP 状态卡死这类问题,不回到规范原文,你连错误现象都描述不准,更别说定位。
这份文档适合两类人:已经会用 ibstat、ibv_devinfo,但说不清队列对为什么需要四个状态的人;以及刚接手 IB 集群,想从协议层而不是交换机命令行建立全局观的运维。下面按我自己的读法和落地顺序讲,照着走一遍,比你从头翻一千页快得多。
2. 规范的正确打开方式:Vol 1 的架构地图与阅读顺序
这份 PDF 最劝退的地方在厚度。实际上真正会反复查的不到三成,问题是大部分人不知道这三成在哪几章。建议先画地图,再决定精读哪块,别从第一页顺序读下去,那是给起草规范的人看的,不是给调试集群的人看的。
2.1 先把协议栈分工看清:Vol 1 和 Vol 2 管的事不一样
InfiniBand 协议栈从下往上分为物理层、链路层、网络层、传输层和管理层。Vol 1 管的是后四层加 Verbs 接口行为,Vol 2 才管物理层,也就是连接器、线缆、光模块、抖动和功耗这些东西。Release 1.4 在很多厂商的兼容性文档里被当作基线引述,OFED 系列驱动和 rdma-core 的实现注释里经常能看到"符合 Vol 1 Release 1.4"这类描述,这是它在存量环境里被引用最多的原因。
这个分工直接决定排错方向。端口在 ACTIVE 和 LinkDown 之间抖动,你去 Vol 1 找链路层条款是找不到答案的,信号质量属于 Vol 2 和硬件手册的地盘。反过来,QP 状态推不动、P_Key 校验失败,这类问题去查硬件手册也没用,必须回 Vol 1 的传输层和管理章节。先把这个边界划清楚,能省下大量无效翻阅。
2.2 建议精读的五块内容
| 内容块 | 定义了什么 | 什么时候回来查 |
|---|---|---|
| 架构概览与术语 | node、port、HCA、switch 的职责,包(packet)在子网内的路由路径 | 第一次读,建立词汇表 |
| 链路层 | 报文格式、基于信用(credit)的流控、链路初始化状态 | 链路时通时断、吞吐减半 |
| 网络层与寻址 | LID/GID 结构、路由头、子网内转发规则 | 配置静态路由、跨子网通信 |
| 传输层 | QP 状态机、RC/UC/UD/RD 服务类型、可靠性语义 | 写 verbs 程序、连接失败 |
| 子网管理与 MAD | SM/SA 职责、P_Key 分区、路径记录(PathRecord) | 算 P_Key、查路径 MTU |
这五块里,传输层和子网管理是排错时翻得最多的。链路层流控容易被忽略,但吞吐问题一半以上跟它有关。网络层寻址相对简单,LID 和 GID 的关系搞清楚就能应付大多数场景。
2.3 阅读顺序:第一遍和第二遍不一样
第一遍建议按这个顺序:架构概览 → 传输层 QP → 寻址 → 链路层流控 → 子网管理。QP 是 RDMA 的核心,先把它状态机看明白,后面理解寻址和流控就有了抓手。读的时候别逐字啃,直接在 PDF 里搜三个词就够了:Queue Pair、Subnet Management、Packet Format,把这三块前后几页精读,其余扫一眼标题。
第二遍是排错时反着查的。从错误码出发回条款:ibv_modify_qp 返回 EINVAL,回传输层查状态机;perftest 吞吐只有线速一半,回链路层查 credit 和 VL 仲裁;应用建链超时,回子网管理查 P_Key 和路径记录。这个"现象反向定位条款"的习惯,比把规范通读十遍都管用。
提示:选一个能把书签展开到三级的 PDF 阅读器,把目录固定显示在侧栏。排错时这份规范就是字典,书签就是索引,检索效率决定你能不能在下班前解决问题。
3. 队列对与寻址:把 infiniband协议条款翻译成硬件行为
很多工程师能倒背 ibstat 的输出,但问到底层为什么是四个状态就说不清了。这一章把 infiniband协议里最核心的 QP 状态机和寻址机制讲透,最后给两条命令,把规范里的字段拉出来和实际环境核对。
3.1 QP 状态机:infiniband协议里连接是怎么活过来的
规范里每个 QP 有六个状态:Reset、Init、RTR、RTS、SQEr、Err。正常生命周期只有一条路径:Reset → Init → RTR → RTS。每个跳变要携带的参数,规范写得非常死,少一个字段 HCA 就拒绝执行。
Reset → Init 这一步配置的是本地身份:P_Key、UD 服务要用的 Q_Key、访问权限(本地写、远端读、远端写这些开关)。Init → RTR 这一步配置的是远端信息:对端 QPN、对端 LID、路径 MTU、接收队列深度。最后 RTR → RTS 才打开发送侧,要配超时、重试计数和 RNR 重试参数。
这个顺序不是随便定的。规范用状态机保证两端对连接视图的一致:你还没告诉 HCA 对端在哪,就让它发数据,等于让快递员在没地址的情况下送件。自己写 verbs 程序的人最容易在这里翻车,后面第五章会详细说。理解了这一点,ibv_modify_qp 的四个调用就不再是背 API,而是按规范走流程。
3.2 LID、GID、P_Key:路由和隔离是两件事
寻址这块有三个标识符,经常被混在一起说。LID 是 16 位,子网内路由用,由子网管理器(SM)分配,相当于二层地址。GID 是 128 位,由 64 位子网前缀加 64 位端口 GUID 组成,概念上像 IPv6。P_Key 是 16 位分区键,bit15 是成员位,0 是受限成员,1 是完全成员,收发两端 P_Key 不匹配,报文在接收端直接被丢。
关键是理解 LID 和 P_Key 的分工:LID 管"怎么走到",P_Key 管"能不能进"。两个端口在同一个子网、LID 互相可达,并不代表应用能通信,还得过 P_Key 校验这一关。很多业务连不上、但 ibping 全通的案例,最后都栽在这。另外,规范里 UD 服务还要过 Q_Key 校验,RC 不用,这也是排查时容易忽略的细节。
3.3 用两条命令把规范参数拉出来核对
读规范是为了验证现实。拿到一台机器,我一般先跑这条:
ibstat | egrep "State|Physical State|Rate|MTU"说明一下怎么看输出。State 行显示 4: ACTIVE,这是端口的逻辑管理状态;Physical State 行显示 5: LinkUp,这是链路物理状态。两者同时满足才算通。Rate 行和 MTU 行分别对应规范里的链路速率和 MTU 字段,后面做性能对照时全靠这两行。
再跑一条,看驱动从 PortInfo 属性里落下来的细节:
ibv_devinfo -d mlx5_0 | egrep "port_state|active_mtu|active_speed|active_width|lid"这里的 active_speed、active_width、active_mtu 就是 Vol 1 的 PortInfo 属性在驱动层的样子。active_width=4X、active_speed=25.0 Gbps (EDR) 时,线速才算 100G。如果 active_width 变成 1X,速率直接除以 4,这是应用跑不满带宽最常见的第一个坑,比调任何应用参数都值得先查。
4. 从规范参数到集群配置:速率、MTU 与端口验收
这一章把规范里的数值参数翻译成集群配置动作。看完能直接回答两个问题:我的链路到底标称多少、实际多少;新交付的端口怎么验收才算合格。
4.1 链路速率与有效带宽对照表
规范里每代速率的信令速率和有效数据率不是一回事,中间被编码开销吃掉一部分。常说的 100G 是线速,应用能拿到的是有效数据率。
| 代际 | 单通道信令速率 | 编码方式 | 4x 线速 | 4x 有效数据率 |
|---|---|---|---|---|
| SDR | 2.5 Gb/s | 8B/10B | 10 Gb/s | 8 Gb/s |
| DDR | 5 Gb/s | 8B/10B | 20 Gb/s | 16 Gb/s |
| QDR | 10 Gb/s | 8B/10B | 40 Gb/s | 32 Gb/s |
| FDR | 14.0625 Gb/s | 64B/66B | 56.25 Gb/s | 约 54.5 Gb/s |
| EDR | 25.78125 Gb/s | 64B/66B | 103.125 Gb/s | 约 100 Gb/s |
8B/10B 编码的有效率是 80%,64B/66B 是约 97%。这套关系在 1.x 版本的规范正文里都有完整定义,你机器上跑的是哪一代,拿 ibstat 的 Rate 行对照这张表即可。
MTU 是另一个关键数值。可选值有 256、512、1024、2048、4096 五档。大包吞吐场景优先 4096,但前提是路径上所有交换机端口都支持,否则子网管理器会把路径 MTU 协商到最小值。延迟敏感的小消息场景不必强求 4096,报文头开销在小包下占比更高,MTU 对延迟的影响没有对吞吐那么直接。
4.2 一张可以直接照抄的端口验收清单
新端口上线,我按下面六步验收,每一步都能对应到规范条款:
- 查端口状态和物理状态,确认 ACTIVE + LinkUp。
- 查 active_width 和 active_speed,确认不是 1X 降速。
- 查链路错误计数器,确认没有反复降级恢复。
- 用 ibping 打一次连通性,分 LID 和 GUID 两种方式。
- 用 ib_write_bw 拉一次带宽,和 4.1 的表对照。
- 查 P_Key 表,确认业务分区和默认分区都在。
其中第三步的计数器在 sysfs 里可以直接读:
iblinkinfo | head -30 cat /sys/class/infiniband/mlx5_0/ports/1/counters/link_error_recovers cat /sys/class/infiniband/mlx5_0/ports/1/counters/symbol_errorlink_error_recovers 持续增长,说明链路在反复降级又恢复,这种抖动最磨人;symbol_error 增长说明信号质量差,多半是光模块、线缆或者连接器的问题。这两个计数器就是规范里链路错误恢复机制的落地表现,比任何应用层日志都早暴露问题。
4.3 QP 深度、CQ 大小和 inline 的常用取值
应用侧参数规范不强制,但给出的是可用的基线。QP 的 send/recv queue depth,吞吐型任务我一般设 1024 到 4096,深度大能扛住瞬时 ops 峰值,但占内存和 cache;延迟敏感型任务设 128 到 512 就够,太深反而让 cache 命中率下降。CQ 大小按所有关联 QP 深度之和来设,或者按最坏情况在途 ops 数乘以 2,避免应用跑到一半 CQ 溢出丢完成事件。
inline 阈值我一般这样设:小于等于 64 字节的 SEND 走 inline,把数据直接塞进 WQE,省一次 DMA 读。连接数多、消息又稀疏的场景用 SRQ 替代每 QP 独立接收队列,内存能省一大截,但要留意 SRQ 下的 RNR 重试行为和独立 RQ 不完全一样,规范里对 SRQ 的接收 WR 归属写得很清楚,用之前建议翻一下。
5. 避坑排查:读规范时最容易翻车的五个常见问题
下面五条都是我在集群上实际遇到、最后回规范条款才对上号的问题。每条按现象、原因、解决写,可以直接当排查手册用。前三条是配置和代码问题,后两条是理解问题,理解问题往往更致命。
5.1 MTU 不一致:ibping 全通,大消息卡死
现象:ibping 正常,小消息也正常,但 RDMA write 大 buffer 要么超时要么卡住,应用日志里看不到明确报错。原因:路径上两端或交换机端口的 MTU 不一致,规范要求路径记录按最小 MTU 协商,但混合厂商环境下 SM 生成的通知不一定在所有设备上生效,实际传输还是按各自的 MTU 走。解决:用 ibstat 看两端 MTU,在子网管理器配置里把最大 MTU 统一到同一档位,重新下发配置后让 SM 重算路径记录,再验证一次两端 active_mtu。
5.2 P_Key 对不上:端口全绿,业务连不上
现象:ibstat 看两个端口都 ACTIVE,链路状态完美,但业务应用建链超时,dmesg 或者应用日志里有 pkey 相关提示。原因:两端端口的分区键不匹配,或者成员位不一致。默认的 0xFFFF 分区能过 ibping,但业务 QP 用的是具体分区键,比如 0x8001,这个键在两端分区表里对不上,报文在接收端直接被丢。解决:对比两端/sys/class/infiniband/*/ports/*/pkeys/目录下的值,确认 0x8001 这类业务键和成员位完全一致,再回到 SM 的 partition 配置里对齐,别只靠 ibping 判断分区没问题。
5.3 QP 停在 RTR:自己写 verbs 最常见的错
现象:用 rdma res show qp 看到 QP state 停在 RTR,或者对端一直报 RNR timeout,程序起不来。原因:modify_qp 的调用顺序没按 Reset → Init → RTR → RTS 走。常见两种情况:还没把远端信息填进 RTR,就把发送侧推到 RTS;或者在 RTR 之前没投递 receive WR,接收队列是空的,对端一发数据就 RNR。解决:严格按状态机分四步调 modify_qp,每步只填该状态需要的属性,在 RTR 之前把该投的 receive WR 投完,再执行 RTR → RTS。改完再用 rdma res show qp 确认状态推进到 RTS,这一步能省大量抓包时间。
5.4 只看 Vol 1 不看物理层:链路抖动像玄学
现象:端口在 ACTIVE 和 Down 之间反复横跳,链路错误计数持续增长,SM 配置怎么调都没用。原因:把规范卷的分工搞混了。Vol 1 管协议行为,但光模块功率不足、线缆老化、连接器接触不良这些信号质量问题属于 Vol 2 和硬件手册的管辖范围,你在子网管理器配置里空转当然无效。解决:先看 symbol_error 和 link_error_recovers 这两个计数器的增长趋势,确认是信号问题后直接换线换模块,别在协议层面浪费时间。链路抖动不是玄学,只是找错了规范的卷。
5.5 把 credit 流控当成 TCP 窗口
现象:吞吐骤降,但 ping 正常、错误计数也正常,调大重试参数完全没用。原因:InfiniBand 链路层用的是信用令牌流控,接收端 buffer credit 耗尽时,发送端是暂停发送,不是丢包重传。把它当 TCP 窗口去理解,就会去调超时和重试,方向完全错了。解决:检查流量是不是集中压在一个 VL 上,调整 SL2VL 映射和 VL 仲裁权重,让流量分布到多个 VL;同时确认接收端 HCA 的 buffer class 配置够用。credit 流控是设计上保证无损网络的关键,理解它之后,很多吞吐问题会重新归类到 QoS 而不是重传。
6. 用规范反推性能瓶颈:一张速查表和两条验证路径
最后一章给两个能直接落地的工具:一张瓶颈现象到规范字段的映射表,和两条验证命令。遇到性能问题先过一遍,能少走一半弯路。
6.1 瓶颈现象 → 规范字段速查表
| 现象 | 先查什么 |
|---|---|
| 带宽只有线速一半 | active_width 是否 1X,link_error_recovers 是否增长 |
| 延迟比预期高很多 | 跳数、SL2VL 映射、是否配置了 QoS 策略 |
| 小消息吞吐差 | 路径 MTU 是否被协商到 256/512 |
| CPU 占用异常高 | CQ 事件模式、inline 是否真正生效 |
| 流量抖动无规律 | symbol_error、VL 流量分布 |
这张表就是从规范字段反着映射回现象。性能问题大多不是应用代码问题,而是某个规范字段没落在预期位置。
6.2 两条最常用的验证命令
ib_read_lat -a -d mlx5_0 -s 16 -n 1000 ib_write_bw -a -d mlx5_0 -q 4 -s 1048576-a 是自动选端口,-d 指定设备,-s 是消息大小,-n 是迭代次数,-q 是 QP 深度。第一条测小消息读延迟,第二条测大消息写带宽。在 EDR 直连的两台机器上,写带宽应该接近 90Gb/s 甚至更高,读延迟在个位数微秒量级。差得远就把 6.1 的表从头过一遍,先看速率和宽度,再看错误计数器,这两步能定位大部分问题。
6.3 我自己的习惯
我的习惯是每次接手新集群,先按第三章的命令把每台机器的 active_speed、active_width 和错误计数器记一张表,再和第四章的速率对照表比对。血泪经验是:太多性能问题最后都归结到 1X 降速、MTU 协商、P_Key 这三件事上,每次都从规范字段对照起,别急着调应用参数。把这份思路带进你的日常排错流程,IB Specification Vol 1-Release-1.4.pdf 就会从收藏夹里的古董变成最顺手的工具。希望帮到你。
本文还有配套的精品资源,点击获取