InfiniBand 高性能互联
课程(6 节,按顺序学)
第 1 课 · ★★★ 先把三个词摆正
入门 · 约 8 分钟
本课目标:把 RDMA / RoCE / InfiniBand 三个词的关系搞对——搞错的话后面全是糊的。
★★★ 「InfiniBand vs RDMA」这个问法不成立
先说结论:InfiniBand 本身就是跑 RDMA 的。
这两个词不在同一个层次上:
· RDMA 是一套语义和接口(verbs)——单边 WRITE/READ、双边 SEND/RECV、零拷贝、内核旁路、硬件卸载。它规定的是「应用怎么让网卡直接搬内存」。
· InfiniBand 和 以太网 是承载它的两种网络——规定的是「包长什么样、地址怎么来、交换机怎么转、怎么不丢包」。
★★ 所以正确的对比是:同一套 RDMA,跑在两种网上。
★★★ 于是 RDMA 有两种主流跑法
| 跑法 | 底下那张网 | 一句话 |
|---|---|---|
| InfiniBand | IB 原生 | 从链路层到传输层整套自己的,需要专用 HCA + IB 交换机 |
| RoCEv2 | 以太网 | 把 IB 的传输层塞进 UDP/IP 里背着走,复用以太网设备 |
★ 还有个 iWARP(把 RDMA 架在 TCP 上),生态小得多,这里不展开。
★★★ 记住这句:RoCE 里的「RDMA」和 IB 里的「RDMA」是同一个东西,连传输层都是同一套(IB transport),只是外面包的皮不一样。
★★ 所以这个模块的仿真是「三路对比」
为了同时回答「跟以太网比」和「跟 RDMA 比」两个问题,仿真一次跑三条:
① 普通以太网 + TCP/IP
② 以太网 + RDMA(= RoCEv2)
③ InfiniBand + RDMA
★★★ 然后你会看到一个非常干净的规律:
· ①↔②③ 差在主机内部(拷贝、系统调用、对端 CPU)
· ②↔③ 主机内部完全一样,差别全在网络层
这个规律本身就是答案。
实验重点
- ★★★ RDMA 是语义/接口,InfiniBand 和以太网是承载它的网络
- ★★★ 「IB vs RDMA」应该问成「IB vs RoCE」——同一套 verbs,换一张网
- ★★ RoCEv2 = 把 IB 传输层装进 UDP/IP 里背着走
第 2 课 · ★★★ 跟普通以太网比:功劳该记给谁
入门 · 约 10 分钟
本课目标:IB 比普通以太网快在哪——以及为什么这份功劳大部分不该记给 IB。
差别分成两层
第一层:主机内部。 普通 TCP 要 2 次拷贝、2 次系统调用、两边内核协议栈都要过、对端 CPU 全程被中断拖进来。
RDMA 全都省掉了:拷贝 0 次、系统调用 0 次、单边时对端 CPU 完全不参与。
第二层:网络层。 地址谁给的、交换机转发表谁写的、无损是设计出来的还是后加的。
★★★ 关键:第一层的功劳属于 RDMA,不属于 InfiniBand
这是最容易搞错的一点。
去仿真页看:② RoCE 跑在普通以太网上,但它「主机内部」那一组数字跟 ③ InfiniBand 一模一样——拷贝都是 0、系统调用都是 0、占 CPU 的阶段数完全相同。
★★★ 也就是说:想拿到那一大半好处,你根本不需要换成 InfiniBand,在现有以太网上开 RoCE 就够了。
★★ InfiniBand 自己的贡献是第二层——那一层小一些,但在特定场景很关键。
★ 别把「差别不在网线上」忘了
三条路径的 HCA → 交换机 → HCA 这一段走的是同一批链路。
IB 在这一段的优势只是交换机转发快一点(直通转发,量级 ~0.15µs vs 以太网 ~0.6µs)和包头短一点。
⚠️ 这点差别在不拥塞时很小 —— 别拿它当 IB 的主要卖点。
实验重点
- ★★★ 「IB 比以太网快」要拆开说:大部分快在用了 RDMA,小部分快在换了 fabric
- ★★★ 想验证这句话:看 ② RoCE 的「主机内部」数字跟 ③ 完全一样
- ★ 网线那一段三条路完全相同
第 3 课 · ★★★ 跟 RoCE 比:差别全在网络层
进阶 · 约 12 分钟
本课目标:同一套 verbs,换一张网。差别精确地落在哪几项上。
★★★ 主机内部:处处相同
同一个 ibv_post_send()、同一套 QP/CQ/MR 概念、同样零拷贝、同样内核旁路、同样硬件卸载。
★★ 连代价都一样:内存照样要注册、QP 照样要一路推到 RTS、双边 SEND 照样要对端先 post RECV。
★★★ 换成 InfiniBand 一条 RDMA 的前置条件都省不掉——因为 IB 跑的就是 RDMA。「④ 忘了注册内存」那个场景就是专门演示这个的:②③ 一起失败,只有 ① 照发。
★★★ 网络层:处处不同
这才是 InfiniBand 真正的东西,四项:
| | RoCEv2(以太网) | InfiniBand |
|---|---|---|
| 地址 | 出厂烧死的 MAC + 自配 IP | ★ SM 分配的 LID |
| 转发表 | 交换机泛洪自学习 | ★ SM 集中算好写下去 |
| 无损 | 后加的 PFC + ECN | ★ credit-based,写在链路层规范里 |
| 建连 | 还得借一条普通 TCP | IB 自己的 CM/SM |
★★ 第 4、5 课分别细讲前两项和第三项。
★★ 一个容易被忽略的:RoCE 建连还得靠 TCP
RDMA 要发数据,得先知道对端的 QP 号和地址,而这些信息 RDMA 自己传不了(QP 还没建起来呢)。
· RoCE:一般借普通 TCP 换 —— 所以 RoCE 机器上那套 TCP/IP 栈少不了
· IB:可以走 IB 自己的 CM(连接管理)+ SM 管理路径,不需要 TCP/IP 栈
★ 反过来说,IB 集群里常见 IPoIB(在 IB 上模拟 IP)——那是为了让只会 socket 的老程序也能跑,不是给 RDMA 用的。
动手:看那个规律
去仿真页,对比表分成「主机内部」和「网络层」两组。
★★ 页面会把 ②③ 相同的行标灰、不同的行标绿——你会看到第一组几乎全灰、第二组几乎全绿。
实验重点
- ★★★ 主机内部 ②③ 处处相同(同一套 verbs,代价也一样)
- ★★★ 网络层 ②③ 处处不同:地址 / 转发表 / 无损 / 建连
- ★★ RoCE 建连要借普通 TCP;IB 用自己的 CM/SM
第 4 课 · ★★★ 地址是被分配的:子网管理器
进阶 · 约 10 分钟
本课目标:IB 最反直觉的一点:没有子网管理器,一张 IB 网连地址都没有。
★★★ 以太网:自组织
· 地址:MAC 出厂就烧在网卡里,全球唯一,谁都不用管
· 找邻居:ARP 自己吼一声「谁是这个 IP」
· 交换机:收到未知目的地就泛洪,看到源 MAC 就学一条
★★ 整套机制没有任何中心角色。插上线就能通——这是以太网能统治世界的原因之一。
★★★ InfiniBand:集中管
· 地址:端口地址叫 LID(16 位本地 ID),由子网管理器(SM)分配。跨子网还有 GID(128 位,类似 IPv6 地址)。
· 交换机:转发表叫 LFT(线性转发表),由 SM 扫出整张拓扑、算好路由、写进每台交换机。
★★★ 所以 SM 不跑的后果非常硬:
端口停在 INIT 状态、没有 LID、交换机不知道往哪转 → 一个数据包都发不出去。
★★ Linux 上的 SM 一般就是 opensm(也可以跑在交换机里)。生产环境要跑主备 SM,因为它是必须活着的角色。
⚠️ 但 SM 不在数据路径上
别误会成「每发一个包都要问 SM」——不是的。
SM 干的是一次性的活:子网启动时(以及拓扑变化时)分配 LID、算路由、写转发表。之后数据包完全不经过 SM,HCA 直接按 LID 发、交换机直接查表转。
★ 仿真里那一步会标成「一次性前置」就是这个意思。
动手:把 SM 关掉
当前场景就是「② 子网管理器没跑」。直接跑一遍:
★★★ 你会看到只有第三张图(IB)挂了、整张发灰,而 ①② 两张以太网的图一切照常。
实验重点
- ★★★ IB 的 LID 是 SM 分配的,不是出厂烧死的
- ★★★ 交换机转发表(LFT)也是 SM 集中算好写下去的
- ⚠️ SM 只在启动/变化时干活,数据包不经过它
- ★★ 生产环境 SM 要跑主备 —— 这是 IB 多出来的运维负担
第 5 课 · ★★★ 无损:设计出来的 vs 后加的
进阶 · 约 12 分钟
本课目标:同样是「不丢包」,IB 和以太网的实现方式差着一个层次。
为什么 RDMA 这么怕丢包
传统 RoCE 的硬件重传是 go-back-N:丢一个包,它后面已经发出去的全部都要重发。
100Gbps 上在飞的包能有几百个,所以丢 1% 就可能让吞吐掉到几成——这跟 TCP 的平滑降级完全不是一个概念。
⚠️ 公平话:较新的网卡已经支持选择性重传(只补丢的那个),比 go-back-N 时代好很多。
★★★ 以太网的办法:后加两个机制
· PFC(Priority Flow Control):交换机缓冲快满了,往上游发个「暂停」帧,让它先别发。
⚠️ 这是钝器:整个优先级队列一起停 → 队头阻塞,级联起来会PFC 风暴,环路里极端情况死锁。
· ECN / DCQCN:交换机在包上打标记,接收方回告发送方「悠着点」,发送方主动降速。
★★★ 主次关系很重要:ECN 主动降速为主,PFC 只做兜底。
★★ 但最关键的是:这两个都要人去配,配错就退化成会丢包的普通以太网。
★★★ IB 的办法:写在链路层规范里
IB 用的是 credit-based 流控:
接收端有多少缓冲空间,就发多少 credit 给发送端;发送端手里没有 credit,就一个字节都不发。
★★★ 所以队列压根不会溢出,也就不存在「因为拥塞丢包」这件事。
★★ 而且这不是一个可以关掉的功能——它是 IB 链路层规范的一部分,没有对应的开关。这就是「设计出来的」和「后加的」的区别。
⚠️ 公平话:IB 也不是永不丢包(比特错误、故障切换照样丢),而且 credit 反压同样会把拥塞往上游扩散(受害流问题),IB 因此也有自己的拥塞控制要调。
动手:看保持率
当前场景是「③ 拥塞 + 以太网无损关闭」。跑一遍看吞吐保持率那一行:
① TCP 掉一截、② RoCE 塌掉、③ IB 几乎不掉。
★★ 然后把「以太网无损」那个开关打开再跑一遍——② 会回来一大截。这说明 RoCE 能做好,但得配。
实验重点
- ★★★ IB:credit-based,写在链路层规范里,关不掉
- ★★★ RoCE:PFC + ECN,后加的、要人配、能配错
- ★★ PFC 是钝器(队头阻塞/风暴/死锁),ECN 主动降速才是主力
- ⚠️ 区别在「默认是不是安全的」,不是「一个行一个不行」
第 6 课 · ★ 该选哪个(不吹不黑)
排障 · 约 8 分钟
本课目标:什么时候值得上 InfiniBand,什么时候 RoCE 就够了。
★ 先问一个便宜的问题
「我现在连 RDMA 都还没用上吗?」
如果是,那第一步根本不是买 IB——是在现有以太网上开 RoCE。
第 2 课已经证明了:那一大半好处(零拷贝/内核旁路/硬件卸载)在以太网上就能拿到。
★★ 什么时候 InfiniBand 确实值
· 超大规模训练/HPC:几千张卡做 all-reduce,拥塞是常态而不是异常 —— 这时「无损是设计出来的」价值巨大
· 对尾延迟极其敏感:IB 交换机直通转发、路径可控(SM 算好的),长尾比自学习+PFC 的以太网稳
· 已经有 IB 生态:MPI、集群调度、监控都围着 IB 建好了
· 需要自适应路由 / 精细拓扑控制:SM 集中算路由这件事在这里是优点
★★ 什么时候别上
· 只有几十台机器、拥塞不是常态 → RoCE 够了,还省一整套设备和运维
· 必须跨子网/跨机房路由 → RoCEv2 基于 IP,天然可路由;IB 跨子网要 router,麻烦得多
· 团队没人会 opensm / ibdiagnet → 多一个必须活着的中心角色(还得跑主备),排障工具链也是另一套
· 同一批机器还要跑大量普通 TCP 业务 → 以太网一张网干两件事更省
★ 一句话总结
「用不用 RDMA」是个大决定,「用 IB 还是 RoCE」是个小决定。
前者决定你能不能省掉拷贝和 CPU(几倍的差别),后者决定你在拥塞时多稳、以及要花多少钱和运维精力。
★★ 先做前者,再考虑后者。
实验重点
- ★★★ 先问「有没有用上 RDMA」,再问「要不要换 IB」
- ★★ IB 值的场景:超大规模、拥塞是常态、对尾延迟敏感、已有 IB 生态
- ★★ 别上的场景:规模不大、要跨子网路由、团队不会运维 SM
- ★ 「用不用 RDMA」是大决定,「IB 还是 RoCE」是小决定