@@ -8,4 +8,242 @@ icon: material/cable-data
88
99 [@Harry-Chen][Harry-Chen]
1010
11- !!! warning "本文编写中"
11+ !!! warning "本文已完成,等待校对"
12+
13+ InfiniBand (IB) 是高性能计算中常用的高带宽、低延迟的网络互联技术。得益于其简单的部署方式和优秀的扩展能力,IB 网络被广泛应用于各种规模的计算集群中。在多年的发展中,IB 战胜了 Intel OmniPath 等技术,成为了 HPC 领域的事实标准。
14+
15+ !!! note "概念辨析:RDMA"
16+
17+ 在讨论 InfiniBand 网络和技术时,不可避免会提到 RDMA 技术。RDMA 是远程直接内存访问(Remote Direct Memory Access)的简称,指允许计算节点(通过网络)直接访问远程节点的内存,绕过操作系统内核的网络协议栈,从而实现低延迟和高吞吐量的数据传输。IB 网络是实现 RDMA 的一种常见技术,此外还有 RoCE(RDMA over Converged Ethernet)、iWARP 等技术也能实现 RDMA。
18+
19+ ## IB 硬件 {#ib-hardware}
20+
21+ 目前主流(也是几乎唯一)的 IB 硬件制造商为 Mellanox(在 2020 年被 NVIDIA 收购)。IB 网络通常由四类设备组成:
22+
23+ * 主机通道适配器(HCA, Host Channel Adapter)
24+ * 目标通道适配器(TCA, Target Channel Adapter)
25+ * 交换机:在子网(subnet)中连接多台 HCA 和 TCA 设备
26+ * 路由器:连接不同子网的交换机,实现跨子网通信
27+
28+ 考虑到 IB TCA 和路由器非常稀有,目前市面上几乎无法见到,本文中将只讨论 HCA(通常称为“IB 卡”)和交换机两类设备。
29+
30+ IB 网络有明确的代际划分,每两代之间最主要的差异就是带宽的提升。目前市面上还见到的 IB 设备主要有以下几代:
31+
32+ | 代号 | 带宽(每通道)| 通道数量 | 物理接口 | PCIe 链路 | Mellanox 型号 |
33+ | ------| ---------------| ----------| ----------| -----------| --------|
34+ | FDR | 14 Gbps | 4 | QSFP+ | PCIe 3.0 x8 | CX3, CX4 |
35+ | EDR | 25 Gbps | 4 | QSFP28 | PCIe 3.0 x16 | CX4, CX5 |
36+ | HDR | 50 Gbps | 4 | QSFP56 | PCIe 4.0 x16 | CX6 |
37+ | NDR | 100 Gbps | 4 | OSFP / 2 × ; QSFP112 | PCIe 5.0 x16 | CX7 |
38+
39+ 表格中的 "CX" 是 Mellanox 的品牌,全名为 ConnectX。除了 CX4 系列有覆盖两个 IB 代际的产品外,其他的系列都对应了一代 IB 标准。IB 标准都是向下兼容的,较新的网卡和交换机都能降级为较老的标准运行。
40+
41+ 为了提升了网络的部署密度,从 HDR 开始,Mellanox 推出了“一拆二”的标准,如 HDR100 是只有两个通道启用的 HDR,速率为 100 Gbps;而 NDR200 则是只有两个通道的 NDR,速率为 200 Gbps。进一步地,从 NDR 开始,交换机侧“二合一”,改为使用八通道 OSFP 接口,每个端口通过线缆可拆分为两个四通道的 OSFP / QSFP112 接口,总共提供 800 Gbps 的速率。也就是说,一台 1U 的 36 口 OSFP NDR 交换机实际可以提供 72 个 800 Gbps OSFP / QSFP112 NDR 接口;再进一步拆分,等价于 144 个 400 Gbps QSFP112 NDR200 接口,背板速率达到了 57.6 Tbps。
42+
43+ !!! question "真的有这么快吗?"
44+
45+ 网卡的最高通信速率受到各个环节中最短板的制约,如交换机速率、(网络)通道数量、PCIe 版本和通道数量等。在采购设备和规划网络时,务必确认各个环节的速率均满足需求。
46+
47+ 常见的降速场景包括:
48+
49+ * PCIe 版本降级或通道数量不足(如单口 HDR 卡插入了 PCIe 3.0 x16 的插槽,物理速率最大只有 128 Gbps):可通过 `lspci -vv` 检查,或者观察 `dmseg` 中 `mlx5` 驱动程序的日志输出;
50+ * PCIe 总线带宽小于端口速率(如双口 HDR 卡在 PCIe 4.0 x16 的插槽上,对外传输速率不可能超过 256 Gbps):可简单计算得出;
51+ * 网络通道速率降级或数量不足(如使用 EDR 交换机连接 HDR100 网口,则网卡降级为只有两通道的 EDR,速率为 50 Gbps;用一拆四的拆分线连接 NDR 交换机的 OSFP 端口和 NDR 网卡的 QSFP112 端口,则单卡速率类似也降级为 200 Gbps):可通过端口速率确认;
52+ * 配置不正确:较新的 IB 卡依赖 PCIe Relaxed Ordering 等高级特性,若控制器不支持或 BIOS 无法启用,也会导致性能无法达到预期。
53+
54+ 熟悉网络设备的读者可能会注意到,IB 标准中的各个速率、物理接口与以太网非常类似。
55+ 这并非巧合,而是因为二者确实共享同样的物理层,包括收发器、电气接口、线缆等,都使用相同的标准。如对此部分感兴趣,可参阅[ 《杰哥的知识库——以太网》] ( https://jia.je/kb/networking/ethernet.html ) 。
56+
57+ 正因如此,绝大部分 IB 网卡都支持 VPI(Virtual Protocol Interconnect),仅需更改固件设置并重启,就能在同等速率的 IB 和以太网模式间自由切换(注:当然需要配合支持对应协议的交换机)。尽管如此,IB 和以太网仍然是两种截然不同的网络技术,在物理层以上,二者的协议栈、寻址方式、传输机制等均不相同,不能直接互联通信。
58+
59+ !!! warning "谨慎采购备件"
60+
61+ 虽说遵守的各类标准相同,但在采购如光模块、线缆等备件时,也不能随意地将以太网标准的产品用于 IB 设备上。
62+ 这是因为 Mellanox 对此有比较严格的兼容性要求(或许是商业考虑?),未明确标明可用于 IB 网络的产品,很可能无法在相应设备上正常工作。
63+
64+ ## IB 软件栈 {#ib-software}
65+
66+ ### 前置知识 {#prerequisite}
67+
68+ 在 RDMA 的抽象中,底层的网络设备和具体协议被称为 fabrics,而上层的通信接口则被称为 verbs。用户(程序员)可使用统一的 RDMA verbs 接口进行通信(如 ` WRITE ` , ` READ ` , ` SEND ` 等),而无须关心底层使用的是哪种 RDMA 技术。Verbs 还可以被封装为更高级的 API,成为 [ Unified Communication X (UCX)] ( https://github.com/openucx/ucx ) 等通信库;它们进一步地被 MPI、NVIDIA NCCL 等高层编程框架所使用,最终为高性能分布式计算提供支持。
69+
70+ ### 驱动程序 {#drivers}
71+
72+ 虽然 Linux 内核包含 [ ` mlx5 ` 驱动程序] ( https://www.kernel.org/doc/html/v6.17/networking/device_drivers/ethernet/mellanox/mlx5/index.html ) ,几乎可以做到开箱即用;Debian 等发行版也打包了相应的用户态工具(如 ` rdma-core ` , ` libibverbs ` 等),但为了获得更好的性能和稳定性,建议安装 Mellanox 官方提供的 [ DOCA-OFED] ( https://developer.nvidia.com/doca-downloads?deployment_platform=Host-Server&deployment_package=DOCA-Host&target_os=Linux&Architecture=x86_64&Profile=doca-ofed ) 驱动包(曾经称为 MLNX_OFED)。官方的安装十分好用,根据情况自行点击选择,并使用 ` apt-get install doca-ofed ` 即可完成安装。
73+
74+ ??? tip "谨防捆绑销售"
75+
76+ [DOCA](https://developer.nvidia.com/networking/doca) 软件栈包含了 NVIDIA 所有网络设备(包括 IB 卡、以太网卡、智能网卡等)的驱动、运行时、SDK、文档等,内容十分庞杂。我们仅需其中的 OFED 部分即可,不必安装多余的软件包。
77+
78+ OFED 的全称是 Open Fabrics Enterprise Distribution,这个名称表明其并非 NVIDIA 独有——话虽如此,目前也[ 没有其他厂商] ( https://stackoverflow.com/questions/58622347/what-is-the-difference-between-ofed-mlnx-ofed-and-the-inbox-driver ) 提供类似的软件包。
79+
80+ 在 DOCA-OFED 安装的大量软件包中,比较重要、耦合比较紧密的包括:
81+
82+ * ` {mlnx-ofed-kernel,srp,knem,iser,isert}-dkms ` :通过 DKMS 编译的各类内核模块,提供网卡驱动和 RDMA 协议栈,以及各类扩展功能(如 SRP、iSER 等);
83+ * ` lib{ibverbs,rdmacm,ibumad} ` :用户态 RDMA 库和管理工具
84+
85+ 这些组件必须从统一来源安装,即必须都来自于发行版(或内核自带),或者都来自于 DOCA-OFED,否则可能会出现微妙而难以解决的兼容性问题。更高层的库或者应用(如 ` rdma-core ` , ` ucx ` , ` openmpi ` 等)可以使用 OFED 自带的版本,也可以遵循 HPC 集群上的惯例,从源码编译安装,以便多版本共存。需要注意,编译时必须遵循从底层到高层的顺序,并打开相应的选项(如 UCX 的 ` --with-rc ` ,OpenMPI 的 ` --with-ucx ` ),才能真正利用硬件。
86+
87+ ??? example "检查设备情况"
88+
89+ 在成功安装驱动程序后,可以通过多种方式查看 IB 设备的状态:
90+
91+ ```text
92+ harry@foo:~$ ls /dev/infiniband/
93+ by-ibdev by-path issm0 issm1 rdma_cm umad0 umad1 uverbs0 uverbs1
94+
95+ harry@foo:~$ sudo ibstat
96+ CA 'mlx5_0'
97+ CA type: MT4129
98+ Number of ports: 1
99+ Firmware version: 28.40.1000
100+ Hardware version: 0
101+ Node GUID: 0xc470bd0300cf4964
102+ System image GUID: 0xc470bd0300cf4964
103+ Port 1:
104+ State: Active
105+ Physical state: LinkUp
106+ Rate: 200
107+ Base lid: 48
108+ LMC: 0
109+ SM lid: 48
110+ Capability mask: 0xa751e84a
111+ Port GUID: 0xc470bd0300cf4964
112+ Link layer: InfiniBand
113+
114+ harry@foo:~$ sudo ibstatus
115+ Infiniband device 'mlx5_0' port 1 status:
116+ default gid: fe80:0000:0000:0000:c470:bd03:00cf:4964
117+ base lid: 0x30
118+ sm lid: 0x30
119+ state: 4: ACTIVE
120+ phys state: 5: LinkUp
121+ rate: 200 Gb/sec (4X HDR)
122+ link_layer: InfiniBand
123+
124+ harry@foo:~$ ibv_devinfo
125+ hca_id: mlx5_0
126+ transport: InfiniBand (0)
127+ fw_ver: 28.40.1000
128+ node_guid: c470:bd03:00cf:4964
129+ sys_image_guid: c470:bd03:00cf:4964
130+ vendor_id: 0x02c9
131+ vendor_part_id: 4129
132+ hw_ver: 0x0
133+ board_id: MT_0000000834
134+ phys_port_cnt: 1
135+ port: 1
136+ state: PORT_ACTIVE (4)
137+ max_mtu: 4096 (5)
138+ active_mtu: 4096 (5)
139+ sm_lid: 48
140+ port_lid: 48
141+ port_lmc: 0x00
142+ link_layer: InfiniBand
143+ ```
144+
145+ 如果设备状态不正常,如长时间显示 `Intializing` 等状态,则说明 IB 子网状态不正常,请参考下一节配置子网管理器。
146+
147+ ## IB 网络管理 {#network-management}
148+
149+ IB 网络贯彻了软件定义网络(Software Defined Networking, SDN)的理念,网络中的所有设备均由专门的子网管理器(Subnet Manager, SM)进行集中管理和配置。SM 负责为各个 HCA 和 TCA 分配 LID 地址、维护路由表、监控网络状态等工作。每个 IB 子网中必须至少运行一个 SM,且通常只有一个 SM 处于活动状态(Active),以避免冲突。
150+
151+ 带管理的 IB 交换机(如 QM8700、QM9700 或者更高级型号)通常内置 SM 功能,可以直接配置为 SM 角色。如果整个网络中都只有不带管理的交换机(如 QM8790、QM9790 等),则需要在集群中的某台节点上运行有 SM 能力的软件。安装 OFED 驱动包时,通常会一并安装 ` opensm ` 软件,只要用 ` systemctl enable --now opensmd ` 启用即可。
152+
153+ !!! tip "启动不了?"
154+
155+ 如果 OpenSM 出现各种奇怪的问题(比如 segfault),首先要检查是否混用了来自发行版与 OFED 的软件包,其次不妨试一试升级你的 OFED,或许有奇效。
156+
157+ ### 网络管理工具 {#network-management-tools}
158+
159+ ` infiniband-diags ` 软件包中带有大量 ` ib ` 开头的可执行文件,可用于诊断和检查 IB 网络的状态。这些工具通常需要管理员权限,并依赖与 ` libibumad ` 库。如:
160+
161+ * ` ibnetdiscover ` :发现并打印 IB 子网中的所有设备和连接关系(可能很长)
162+ * ` ibnodes ` , ` ibswitches ` , ` ibhosts ` , ` sminfo ` :打印子网中的交换机、主机和 SM 信息
163+ * ` ibportstate ` , ` iblinkinfo ` :打印端口状态和链路信息
164+
165+ ` perftest ` 软件包中则带有通常无需权限的 ` ib_* ` 系列的性能测试工具,可用于测试 IB 网络的带宽和延迟。如:
166+
167+ * ` ib_read_lat ` , ` ib_write_lat ` :测试 RDMA 操作的延迟;
168+ * ` ib_read_bw ` , ` ib_write_bw ` , ` ib_send_bw ` , ` ib_send_bw ` :测试 RDMA 操作的带宽,通常测试值应该接近网卡的端口速率。
169+
170+ 此外,也可通过上层应用测试 IB 网络的性能,如 UCX 自带的 ` ucx_perftest ` 套件,经典的 [ OSU MPI Benchmark] ( https://mvapich.cse.ohio-state.edu/benchmarks/ ) 、[ nccl-tests] ( https://github.com/NVIDIA/nccl-tests ) 等。
171+
172+ ### GPUDirect RDMA
173+
174+ NVIDIA 的数据中心系列 GPU 均有 [ GPUDirect RDMA] ( https://docs.nvidia.com/cuda/gpudirect-rdma/ ) 支持,允许第三方设备(如 IB 卡)直接读写 GPU 显存,从而大幅降低延迟、提升带宽。
175+
176+ 如果要启用此功能,则需要保证:
177+
178+ 1 . IB 卡与 GPU 在同一个 PCIe 根复合体(Root Complex)下,如直连于同一个 CPU 的 PCIe 插槽,或者在同一个 PCIe 交换芯片下(可通过 ` nvidia-smi topo -m ` 或者 ` lstopo ` 等方式检查);
179+ 2 . 在安装 OFED 后再编译 NVIDIA GPU 驱动,以保证 ` nvidia-peermem ` 模块是使用 OFED 提供的内核头文件编译的;
180+ 3 . 在加载 GPU 驱动后,加载 ` nvidia-peermem ` 模块。
181+
182+ GPUDirect RDMA 的支持没有直接检测的手段,部分通信库(如 [ NCCL] ( https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/env.html#nccl-ib-cuda-support ) )可通过环境变量来控制此功能的启用与否。
183+
184+ ### IP over IB {#ipoib}
185+
186+ 虽然 IB 网络不是以太网,但通过 IP over IB(IPoIB)协议,可以让 IB 支持 IP 协议栈,从而兼容现有的大量应用程序和工具。IPoIB 协议由内核模块 ` ib_ipoib ` 提供,安装 OFED 驱动包时会一并安装。启用 IPoIB 后,系统中会多出 ` ib ` 开头的虚拟网络接口,每个 IB 子网对应为一个 IPoIB 的广播域。此接口可通过标准的网络配置工具(如 ` ip ` , ` ifconfig ` , ` netplan ` 等)进行配置和管理,也可以运行任何 TCP/IP 负载。
187+
188+ ??? question "高级网络功能"
189+
190+ IPoIB 网络不提供传统意义上的 VLAN 支持,但可以通过配置 IB 子接口的方式实现;也不能通过链路聚合(bonding)进行负载均衡,而只能提供一定的冗余(failover)能力。具体配置方式请查阅文档。
191+
192+ 虽然 IPoIB 提供了极大的便利性,但由于其额外的协议开销,性能通常低于直接使用 RDMA verbs 接口。因此在可能的情况下,应尽量使用原生 RDMA 协议进行通信,如将 iSCSI 替换为 [ iSER] ( https://docs.nvidia.com/doca/sdk/iSER+-+iSCSI+Extensions+for+RDMA/index.html ) ,将 NFS 替换为 NFS over RDMA,将基于 TCP 的 MPI 替换为基于 UCX 的 MPI 等。此外,IPoIB 的默认 MTU 较低(通常为 2044 字节),也会影响性能,建议酌情调整(如 4092 或 65520 字节)。
193+
194+ ### 设备管理工具 {#device-management-tools}
195+
196+ 在安装 OFED 时,还会一并安装 ` mft ` 软件包,其中包含了 Mellanox Fabric Tools (MFT) 工具集。MFT 提供了大量管理和配置 IB 设备的工具,常用的包括:
197+
198+ * ` mlxconfig ` :用于查看和修改设备的配置参数,如启用/禁用 VPI 模式、强制设置链路速率等;
199+ * ` mlxfwmanager ` , ` flint ` :用于升级和管理 Mellanox 设备的固件,后者更为底层;
200+ * ` mlxlink ` , ` mlxcables ` :用于查看和配置链路和线缆信息;
201+
202+ 这些工具通过私有协议与主机和网络上的 Mellanox 设备通信,能对设备进行复杂的配置,通常需要管理员权限才能运行。
203+
204+ ??? example "工具使用示例"
205+
206+ 下面是使用 mlxcables 查询线缆信息的示例:
207+
208+ ```text
209+ root@foo:~# mst start
210+ Starting MST (Mellanox Software Tools) driver set
211+ Loading MST PCI module - Success
212+ Loading MST PCI configuration module - Success
213+ Create devices
214+ Unloading MST PCI module (unused) - Success
215+ root@foo:~# mst cable add
216+ Added 1 mellanox cable devices.
217+ root@ja1:~# mlxcables
218+ Querying Cables ....
219+
220+ Cable #1:
221+ ---------
222+ Cable name : mt4123_pciconf0_cable_0
223+ >> No FW data to show
224+ -------- Cable EEPROM --------
225+ Identifier : QSFP28 (11h)
226+ Technology : Copper cable unequalized (a0h)
227+ Compliance : 50GBASE-CR, 100GBASE-CR2, or 200GBASE-CR4, HDR,EDR,FDR, QDR,DDR,SDR
228+ Attenuation: 2.5GHz : 3dB
229+ 5.0GHz : 5dB
230+ 7.0GHz : 6dB
231+ 12.9GHz : 10dB
232+ 25.78GHz : 0dB
233+ OUI : 0x0002c9
234+ Vendor : Mellanox
235+ Serial number : MT2115VS01418
236+ Part number : MCP1650-H002E26
237+ Revision : A4
238+ Temperature [c] : N/A
239+ Digital Diagnostic Monitoring : NO
240+ Length [m] : 2 m
241+ ```
242+
243+ 可以看到这是一根原装 HDR DAC(同时也支持 200G 以太网),长度是 2 米,型号是 MCP1650-H002E26。
244+
245+ !!! tip "注意更新固件"
246+
247+ 如果发现 IB 网卡有明显的性能或者稳定性问题,或者在升级系统 / OFED 后发生设备丢失等情况(即 PCIe 设备还存在,但无法识别为 IB 设备),则很可能是固件版本过旧导致的,更新固件或许可以解决这些问题。
248+
249+ 安装新的 OFED 软件包时,通常会一并为支持的型号安装最新的固件版本。但太老的卡或者 OEM 型号都不在自动升级的范围内,需要手工下载安装。可以参考[《杰哥的{运维,编程,调板子}小笔记——升级 Mellanox 网卡固件》](https://jia.je/hardware/2022/11/23/upgrade-mlnx-firmware/)获得一些经验。
0 commit comments