资讯详情

InfiniBand网络实战指南:从硬件选型到性能调优

📅 2026/9/17 10:47:51 | 华诺云谱 👁 阅读
InfiniBand网络实战指南:从硬件选型到性能调优
1. InfiniBand 到底是个什么网为什么需要它先说结论InfiniBand 本质上是一套为高性能计算设计的互联体系从物理层线缆、交换机到链路层协议、网络层管理再到传输层的 RDMA 行为全部是专门为“低延迟、高带宽、低CPU开销”这三个目标服务的。很多第一次接触 IB 的朋友第一反应都是“这玩意儿不就是网卡吗跟 25G/100G 以太网有什么区别”。区别大了而且这些区别直接决定了你怎么选硬件、怎么配参数、怎么调优。我最早接触 IB 是在一个科研计算集群里当时几十台 GPU 服务器做分布式训练用万兆以太网卡在 NCCL allreduce 这一步带宽上不去、CPU 中断爆炸一跑大规模模型就训练效率暴跌。后来换了 IB整个链路延迟直接从几十微秒降到个位数微秒CPU 基本不再参与数据搬运这才体会到什么叫“网络是为计算服务的”。这篇文章我不打算只贴命令而是把从硬件选型、驱动安装、子网配置、性能测试到问题排查这条路走一遍让你拿到 IB 设备后能少踩坑。适合刚接触 IB 的集群管理员、做高性能计算或 AI 训练的工程师还有准备给公司搭高速互联方案的运维朋友。文章里的操作基于常见的 Mellanox 网卡现在叫 Nvidia Networking和 InfiniBand 子网环境大部分命令在主流 Linux 发行版上可以直接复用。1.1 和以太网最大的区别在哪里如果只用一句话总结 IB 和以太网的区别那就是以太网是“尽力而为”的共享网络InfiniBand 是“面向连接”的交换网络。传统以太网数据包要经过 TCP/IP 协议栈每一层都有拷贝、校验和中断处理CPU 开销非常大。虽然现在有 RDMA over Converged EthernetRoCE可以借用 IB 传输语义跑在以太网上但 RoCE 对网络的丢包极其敏感需要无损以太网配置。IB 从底层就不同它天然支持RDMARemote Direct Memory Access网卡可以直接读写远端服务器内存不需要双方 CPU 参与。基于信用credit的流控机制从物理上避免丢包不像以太网需要靠 PFC 之类的额外机制。子网管理器Subnet Manager统一管理全网路径计算和配置网络拓扑和状态一目了然。所以 IB 不是“更快的以太网”而是另一套网络体系。这也意味着用配置以太网的经验去配 IB 会处处碰壁你必须要理解子网管理器、分区、GID 这些概念。1.2 硬件架构HCA、交换机、线缆一张图看懂拓扑IB 网络的硬件角色很清晰端点上用的是 HCAHost Channel Adapter也就是 IB 网卡中间互联靠 IB 交换机线缆分为铜缆和光纤两种。一个最基本的 IB 子网由一台交换机、若干台带 HCA 的服务器、以及连接它们的线缆组成。拓扑上常见的是 Fat-Tree胖树核心层和接入层构成多路径。因为 IB 是交换网络子网管理器会为每个节点计算路径并支持自动负载均衡。实际应用里小规模两三个节点可以直接用线互联一台交换机几十上百个节点就要考虑多台交换机的组网了。HCA 目前市面上主流的都是 Nvidia 的 ConnectX 系列比如 ConnectX-5、ConnectX-6、ConnectX-7当然也有早期 QLogic 的卡。带宽从 EDR100Gb/s到 HDR200Gb/s、NDR400Gb/s不等。选型时除了看端口速率还要注意 PCIe 接口版本和通道数否则网卡带宽跑不满。比如一张 HDR100 的卡100Gb/s理论上需要 PCIe 3.0 x16 的带宽才足够如果插在 PCIe 3.0 x8 上瓶颈就出现了。1.3 典型应用场景与选型判断IB 最典型的应用场景是 HPC比如分子动力学模拟、气象预报、AI 分布式训练、高性能存储NVMe over Fabric以及部分对延迟极为敏感的金融交易场景。如果你在做以下事情IB 是有意义的多台 GPU 服务器组成集群跑 NCCL跨节点通信量巨大。数据库或大量小 IO 的存储系统需要稳定的微秒级延迟。跑 MPI 并行程序节点间频繁同步。如果你的业务只是传统的 Web 服务、数据库集群、视频传输那 IB 的成本和复杂度其实不太划算RoCE 或者普通高速以太网可能更合适。说白了IB 是为“通信占比高、延迟敏感、带宽饥饿”的应用准备的别盲目追求高端技术。2. 硬件选型与安装配置从拆箱到插线硬件层面的坑往往比软件更难排查所以我建议在采购阶段就把细节想清楚。别拿到货才发现线缆长度不够、接口速率不匹配、网卡散热太高占不上槽位。2.1 HCA 网卡选型注意什么选 HCA 时看这几个关键参数端口速率现在主流是 EDR 100G、HDR 200G预算充足可以上 NDR 400G。同一张卡可能有单端口和双端口版本双端口卡在冗余或多路径组网时更方便但价格也高。PCIe 接口至少 PCIe 3.0 x16最好 PCIe 4.0 x16。如果是 HDR200PCIe 4.0 x16 才比较稳妥。注意很多服务器主板的 x16 插槽可能只有 x8 电气通道要查清楚。接口形态有 PCIe 插卡、也有 OCP 夹层卡。服务器规格要匹配。是否支持以太网模式有些卡同时支持 IB 和以太网如 ConnectX-6 Dx可以一台机器既跑 IB 又跑以太网但要刷不同固件。插卡之前先看服务器散热风道高功率 HCA 在密闭机箱里可能会过热降速。我遇到过一张卡跑一会就掉链子后来才发现是旁边 GPU 的散热风道把它挡得死死的。2.2 线缆铜缆光缆怎么选IB 线缆有有源铜缆DAC、有源光缆AOC和光模块光纤三种。距离短比如机柜内一两米用 DAC 最经济功耗也低距离长跨机柜、跨机架用 AOC 或者可插拔光模块。有个经常被忽略的点线缆的速率和接口类型必须匹配网卡和交换机的速率。HDR 的线缆带宽 200G向下兼容 EDR 吗取决于具体线缆和重协商能力但官方建议尽量匹配不然链路可能只能协商到低速档位。买线时确认线缆支持的最高速率不要光看接口形状一样就下单。2.3 交换机配置与子网管理器IB 交换机分为托管和非托管两种。小型交换机比如 36 端口通常内置了子网管理器开机就自动跑不需要额外配置。大型模块化交换机则需要外置的子网管理器服务OpenSM跑在有网络连接的服务器上。子网管理器是 IB 网络的核心它负责分配 LIDLocal Identifier计算路由维护网络拓扑。如果子网管理器挂了整个网络的路径就会失效哪怕物理链路是好的节点之间也通信不了。所以生产环境里最好跑两个子网管理器做冗余Master/Slave我用 OpenSM 时习惯至少起两个实例。OpenSM 通常由 infiniband-diags 软件包附带启动命令很简单systemctl start opensmd systemctl enable opensmd或者手动跑opensm -F /etc/opensm/opensm.conf启动后可以用iblinkinfo查链路状态用ibnetdiscover查看网络拓扑。2.4 驱动安装与固件更新HCA 驱动通常建议直接从官网或系统发行版仓库装。以 Mellanox 卡为例子装驱动前先确认内核版本然后下载匹配的 MLNX_OFED 驱动包。直接用发行版自带的mlx5_ib驱动也可以但功能可能不全尤其是后面做性能调优时很多配置需要mlx5驱动开启额外参数。安装 MLNX_OFED 的大致步骤wget https://www.mellanox.com/downloads/ofed/MLNX_OFED-5.8-x86_64.tgz tar xzf MLNX_OFED-5.8-x86_64.tgz cd MLNX_OFED-5.8-x86_64 sudo ./mlnxofedinstall --add-kernel-support安装过程中会编译内核模块需要安装内核开发包。装完后运行ibv_devinfo能看到 HCA 信息说明驱动加载正常。固件更新也很重要。我建议在装完驱动后立刻用mlxup工具检查并升级固件到厂商推荐版本。旧固件可能有稀奇古怪的 bug比如丢包、链路协商慢等。更新固件时务必保证机器不断电最好通过带外管理口操作。2.5 服务器端配置 IP 和开机自动加载IB 网卡支持两种协议栈IPoIBIP over InfiniBand和原生 RDMA。IPoIB 是为了兼容传统 TCP/IP 应用但性能不如 RDMA。配置 IPoIB 时接口名一般是ib0需要设置 MTU。以 RHEL/CentOS 系为例在/etc/sysconfig/network-scripts/ifcfg-ib0里DEVICEib0 TYPEInfiniBand ONBOOTyes BOOTPROTOstatic IPADDR10.0.0.1 NETMASK255.255.255.0 MTU65520 CONNECTED_MODEyes注意 IB 的 MTU 有两种模式Datagram 模式默认 2048或 4092Connected 模式支持最大 65520。如果你的应用是 RDMAConnectX 驱动默认创建 rdma0? 不是实际上 RDMA 通信不依赖 IP而是依赖 GID。IPoIB 只是给传统 TCP/IP 用的。开机自动加载模块可以写echo mlx5_core /etc/modules-load.d/mlx5.conf然后重启检查。3. 核心机制与关键配置RDMA、GID、分区和 QoS刚开始用 IB 的人最大的认知障碍是“RDMA 跟 TCP 不一样”TCP 用 IP端口寻址RDMA 用的是 GID/QPN 等一套机制。不理解这些底层东西遇到“网络通但不能跑 RDMA”时完全无从下手。3.1 RDMA 怎么工作绕过内核直接读写内存RDMA 的核心是网卡可以直接访问应用注册的内存区域memory region发送数据时不经过操作系统的 socket 缓冲区也不需要 CPU 逐包拷贝。这个过程在代码里通过 verbs API 完成应用先注册内存缓冲区然后下发收发请求WR给网卡网卡从内存中取数据通过网络发送到对端网卡对端网卡直接写入对端应用的缓冲区。这样做的好处是延迟极低、CPU 占用率极低。代价是应用代码必须显式管理内存注册、连接建立QP 的状态机、完成事件处理。这部分如果由中间件处理比如 NCCL、MPI、libfabric你就不用自己碰但排障时还是要理解。建立 RDMA 连接需要四元组的 QP 信息LID、QPN、PSN 等一般通过 CMConnection Manager自动交换。如果中间被防火墙隔离或者交换机分区配置不对连接就会超时。用ib_write_bw测试时如果停在等待对端接入多半是网络层就不通。3.2 配置 IB 分区partition隔离业务IB 分区类似以太网的 VLAN用来隔离不同的流量域。同一分区内的节点才能通信跨分区不能。为什么要分区一个典型场景是多租户集群不同的应用跑在同一套 IB 网络里互不干扰更安全。在 OpenSM 里配置分区需要修改partitions.conf文件。默认情况下所有节点都在默认分区0x7fff里名称叫Default。假设我想建一个 GPU 分区包含它的节点 GUID 或者端口 GUID按如下语法Default (0x7fff, 全节点默认) GPUPART (0x0001, 限制成员): ib0 实际配置语法看 OpenSM 版本一般是通过guid-list来指定partitions.conf: GPUPART0x0001,ipoib,rate4x,mtu4092 guid0x248a070300xxxxxx, full分区配置不是我的重点但提示一句改了分区要opensm -F重载或者重启 OpenSM而且要小心不要把自己锁在外面。小规模集群如果不需要隔离保持默认分区就好。3.3 MTU、流量控制、拥塞控制参数IB 的物理链路是无损设计靠链路层的信用机制保证不丢包。但这不代表没有拥塞拥塞会导致队列溢出和延迟抖动。所以 IB 有线级流控 拥塞控制Congestion Control两套机制。影响最大的参数是 MTU。默认 datagram 模式 IB MTU 最大 4092或 2048 取决于交换机这远小于以太网 MTU。如果你的应用是 MPI 大数据块传输建议开启 connected 模式并把 MTU 设大。对于 IPoIB在 ifcfg 里设CONNECTED_MODEyes和MTU65520可以明显提升 TCP 大包性能。在 RDMA 侧也可以设置路径 MTUpath MTU。用ib_write_bw时可以加-m 4092指定 MTU 大小匹配链路的最大 MTU 才能发挥性能。另一个隐藏参数是mlx5_core模块的num_vfs、log_num_mkeys等通常默认即可。但要注意 BIOS 里的 PCIe ACS、SR-IOV 设置会影响虚拟化环境性能。流量控制方面IB 交换机和 HCA 自动启用 link-level flow control一般不需要手动配置。如果在交换机 CLI 里看到了丢包计数优先检查线缆、光模块和交换机端口协商速率而不是盲目调 QoS。3.4 CPU 亲和性与中断绑定这是最容易被忽略的性能优化点。IB 网卡收到数据后会通过 MSI-X 中断通知 CPU。中断落在哪个 CPU 核心上很关键如果你把 RDMA 数据放到了网卡所在的 NUMA 节点外的内存跨 NUMA 访问会带来额外延迟和带宽损失。查看网卡所在 NUMA nodecat /sys/class/infiniband/mlx5_0/device/numa_node推荐做法把处理网络中断的 CPU 和运行应用/MPI 进程的 CPU 分开。使用irqbalance自动平衡也可以但生产环境我一般手动绑核。对于 NCCL还要设置NCCL_IB_DISABLE之外的参数比如NCCL_SOCKET_IFNAMEib0保证走对网卡。中断绑定示例假设 HCA 在 NUMA 1CPU8-15把中断 affinity 写到irqpoll或者使用set_irq_affinity.sh脚本Mellanox 驱动自带。目标就是让中断由 NUMA 近端的核心处理。3.5 内核参数优化一些常见的网络内核参数对 IB 同样有影响尤其 IPoIB。推荐在/etc/sysctl.conf里设置net.core.rmem_max 67108864 net.core.wmem_max 67108864 net.core.rmem_default 262144 net.core.wmem_default 262144 net.ipv4.tcp_rmem 4096 87380 67108864 net.ipv4.tcp_wmem 4096 87380 67108864另外关闭反向路径过滤rp_filter和无关的 offload 有时有帮助但别盲目改。最重要的是如果你用 RDMA verbs这些 TCP 参数并不影响 RDMA 性能只影响 IPoIB 下的 TCP。RDMA 性能的关键还是看内存注册方式、MTU、NUMA。4. 性能测试与调优实测数据说话不测性能一切都是玄学。我给自己定的规矩是任何网络环境交付前必须先跑一轮ib_write_bw和ib_read_bw记录基线。后面改了配置再跑一轮对比谁好谁差一目了然。4.1 测试工具安装与常用命令测试工具一般随perftest软件包发布。在 Ubuntu 上apt install perftest infiniband-diags或者编译安装 OFED 时也自带 perftest。工具包括ib_write_bw、ib_read_bw、ib_send_bw、ib_lat等。最常用的ib_write_bw测试的是 RDMA Write 的带宽ib_read_bw测试 RDMA Read 的带宽ib_lat测延迟。先确认 HCA 状态ibstat输出里能看到状态是Active物理链路为LinkUp。再跑ibv_devinfo查看端口速率、固件版本、支持 capabilities。4.2 带宽和延迟测试步骤测带宽先在服务端被动端跑ib_write_bw -d mlx5_0 -x 3 --report_gbits-d指定设备-x指定端口。然后在客户端跑ib_write_bw -d mlx5_0 -x 3 --report_gbits 10.0.0.2这里的 IP 地址是 IPoIB 的地址用于建立 CM 连接RDMA 数据本身不依赖 IP 协议。默认测试时间 10 秒会输出吞吐量和消息速率。测延迟用ib_lat -d mlx5_0 -x 3 10.0.0.2结果里关注t_avg和t_max单位微秒。例如 HDR100 卡在使用 2MB 消息大小时带宽能接近 100Gbps约 12.5 GB/s延迟在个位数微秒。4.3 测试结果分析距离线速还差多少如果测出来的带宽明显低于预期不要急着怪网卡。按顺序排查链路速率协商ibstatus看ActiveSpeed是否是HDR、EDR如果变成了SDR10Gbps或DDR25Gbps检查线缆和端口配置。PCIe 运行带宽mlxlink命令可以看到实际 PCIe 速率和宽度。如果Lanes16SpeedGen3那么理论上限 126 Gbps对 HDR100 够用但如果运行在 x8瓶颈就是 63 Gbps。消息大小小消息测的是延迟不是带宽要用大消息-s 8388608看峰值带宽。CPU 瓶颈跑top看是否有单核跑满。RDMA 虽然不占用处理数据包的高 CPU但应用侧内存拷贝和测试工具本身也会消耗 CPU。NUMA 问题客户端和服务端测试进程要绑定到各自网卡所在 NUMA 节点。用numactl包一层。4.4 性能瓶颈排查PCIe带宽、NUMA、CPU频率有一次我遇到 HDR100 只能跑到 50Gbps怎么看链路都是 Active最终查出是 PCIe 3.0 x8 插槽限制了带宽。服务器有个 x16 的插槽被 GPU 占了网卡插在 x8 上结果最高只能 63Gbps 左右。换了个 x16 插槽立刻满速。所以别只看网卡端口速率PCIe 通道才是隐藏瓶颈。还有一个典型案例GPU 服务器上用 NCCLIB 明明测满速了但训练还是慢。后来发现通信数据经过内存拷贝没有做 GPU Direct RDMAGDR。GDR 使得 GPU 显存可以直接被 IB 网卡访问绕过了 CPU 和主机内存。启用 GDR 需要在驱动安装时加入相关补丁并在容器里挂载/dev/infiniband同时有对应的nvidia_peermem模块加载。这一步做完NCCL 性能有质的提升。CPU 频率方面服务器 CPU 在 Boosting 模式下延迟更稳定但如果是高负载环境建议关闭 C-state 退化idt用 performance governorcpupower frequency-set -g performance不过要注意散热和功耗长期跑训练机器可以这么干。4.5 一些实际调优案例案例1IPoIB 传输大文件带宽上不去。把 IPoIB 从 datagram 模式换成 connected 模式MTU 从 2044 改成 65520scp 从 1.2 GB/s 提升到 7 GB/s。改完记得重启网络服务或重开连接。案例2MPI 任务微调卡在 OpenMPI 连接时。我设置了btl_openib_if_includemlx5_0:1强制走 IB 端口而不是回环或以太网。案例3分区没配置好导致跨节点 RDMA 超时。检查ibnetdiscover里 node GUID 是否在同一个 partition。分区配置修改后必须重新启动 OpenSM 才会生效而且 opa如果节点本身有 ACTIVE 链路但 P_Key mismatch两端 GID 无法互通。5. 常见问题与排查技巧实录5.1 链路起不来、状态 Downibstatus显示State: Down、Physical: Poll。可能原因线缆损坏、两端速率不匹配、HCA 没有被识别、交换机端口禁用。排查步骤dmesg | grep -i mlx5看驱动是否有报错比如 missing firmware。ibv_devinfo能看到设备吗如果看不到设备先检查驱动。换线、换端口看是否有改善。在交换机端看端口状态有的交换机端口默认 disable需要 enable。另外mlxconfig里可以设置端口类型IB 或 Ethernet如果被误设为 Ethernet链路也不起。5.2 驱动正常却无法建立RDMA连接ibstat状态 Active但跑ib_write_bw连不上。这种情况通常不是链路层问题而是传输层或网络层问题。常见原因子网管理器没有正确运行节点拿不到 LID。检查ibstat中Base LID是否非 0。分区不匹配P_Key不一致。查看/sys/class/infiniband/mlx5_0/ports/1/pkeys/。IPoIB 地址配置错误或者对端不可达。ping 一下 IPoIB 地址试试。防火墙拦截。IB 通信可能用到 IPDDR? 如果装了 firewalld先临时停掉测试。5.3 网络通了但带宽极低最常见原因就是前面提到的 PCIe 或链路协商速率问题。除此之外检查 MTUib_write_bw -m 4092与-m 2048对比如果差异巨大找交换机是否限制 MTU。还有可以试试多线程测试ib_write_bw -d mlx5_0 -x 3 -q 8 --report_gbits 10.0.0.2小规模单连接达不了线速用-q增加并发 QP 数模拟真实多流场景。这时候要考虑交换机是否支持自适应路由老交换机可能把所有流打在同一条 path多流增益有限。5.4 交换机报错或丢包IB 理论上无损但不会背压、缓存配置错误也会丢包。登录交换机 CLI看端口计数器里的link_recovery、symbol_err_cnt、local_link_integrity_err。这些通常指向光模块质量或线缆问题。另外交换机里改过 QoS 或分区后容易出现路径计算不一致建议重启 OpenSM 让子网管理器重新下发配置。我有一次改了分区后全网延迟抖动就是因为一台交换机上跑的专属 OpenSM 没有刷新重启后就好了。5.5 排查命令速查表场景命令看什么查看 HCA 基本信息ibv_devinfodevice name, firmware, port state查看链路状态ibstatState, Physical, Rate, Base LID查看活动链路线速ibstatusActive Speed 是否 HDR/EDR查看 CPU PCIe 信息mlxlink -m当前 PCIe 速率和 Lane查看网络拓扑ibnetdiscover节点 GUID、交换机连接关系查看链路统计perftest_query? 不用mst/mlxlink丢包、误码计数检查驱动日志dmesg -T | grep -i mlx5驱动加载、firmware 报错这些工具如果你没有装好infiniband-diags和mft即可。生产环境备台能连接所有节点的管理机预先装好这些命令出问题时才不会手忙脚乱。我个人的操作习惯是每次换线、换卡、改分区后都留一份ibstatusibnetdiscover的输出存档。后面如果出现诡异问题把前后输出 diff 一下基本能秒定位到是哪次改动引入的故障。另外再分享一个我踩过多次的坑千万记得给 IB 节点配置统一的CONNECTED_MODE属性。IPoIB 的 connected 模式和 datagram 模式在同一台交换机上不能混用否则某些节点之间无法通信。我当初是部分节点手动设了CONNECTED_MODEyes另外一些用的默认 datagram结果 TCP 连接时通时不通排查到抓狂。最后把所有节点统一改成 connected问题消失。如果你们不想用 IPoIB只是 RDMA 调用那这条就无关紧要但一定要确认应用走的是哪套协议栈。关于性能优化最后再补一句没有哪一套参数通吃所有应用。你用 MPI 大数据包和用 NCCL 小消息同步最佳 MTU、队列长度、CPU 绑定策略都不同。所以我建议把每个应用的基线测好再单独微调不要一上来就把系统参数全家桶式地改一遍。改了之后重启网络或 OpenSM一定要重新跑测试对比亮数据别人说的“最佳配置”未必适合你的场景。这就是我最想强调的实战原则以可复现的测试为准让数字说话。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。