十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

InfiniBand网络实战指南:从硬件选型到性能调优全解析 1. 先说清楚一件事IB到底比以太网强在哪去年帮朋友调一个四节点的小型AI训练集群Mellanox ConnectX-6 HDR网卡全部插好线也接好系统里ibstatus一看端口全是Down。折腾了一下午最后发现是子网管理器SM没有启动。当时我就想关于InfiniBandIB最容易被新手忽略的恰恰是它最核心的运行机制——IB不是插上卡、装完驱动就能用的以太网它是一套完整的独立互连架构。很多人会问现在RoCERDMA over Converged Ethernet不是也挺火吗为什么还要单独搞一套IB网络这个问题我后面会详细展开。先说结论如果你的业务是HPC跑MPI、GPU大规模训练、分布式存储这类对带宽和延迟极度敏感的场景IB在端到端稳定性、拥塞控制和运维心智负担上依然有明显优势。尤其在大模型训练集群里几千张GPU做AllReduce通信时间占比极高IB的原生RDMA机制能把时延压到微秒级这是普通以太网协议栈很难做到的。这篇文章不是厂商白皮书是我自己从硬件选型、服务器部署、驱动安装、子网管理器配置到perftest性能验证、系统级调优、故障复盘这样一个完整链路走下来的实战记录。涉及的所有步骤都是我在真实集群上操作过的命令可以直接抄参数也给了推荐值。适合三类人看第一次搭IB网络、准备升级集群互连、以及已经被IB坑过但没找到根因的工程师。1.1 为什么有RoCE了还要上IBRoCE本质上是在以太网上跑RDMA它的优势是复用现有以太网交换机和管理体系采购成本低。但代价是为了不让报文丢失整个以太网必须配置成无损网络——开启PFC流控、ECN显式拥塞通知、合理规划缓冲区。这套东西在实验室里跑通容易在几千个端口的生产环境里做到稳定不丢包难度比大多数人想象中大得多。IB则不一样它从设计之初就为RDMA服务。链路层有基于信用的流控机制Credit-Based Flow Control每个接收端维护可用信用数发送端没有信用就不能发数据从机制上杜绝了报文因缓冲区溢出而丢失。加上IB自带的拥塞控制Congestion Control和自适应路由多对一流量场景下的表现比RoCE稳定。在AI训练场景里通信步长非常频繁任何一处丢包重传都可能让整个训练卡住IB这种机制上不留坑的设计能省下大量排查时间。1.2 IB的性能代际与真实场景选择IB的速率代际很容易搞混我先用一张表说清楚代际单通道速率4x端口理论速率常见接口SDR2.5 Gbps10 GbpsCX3QDR10 Gbps40 GbpsCX3/CX4FDR14.0625 Gbps56.25 GbpsCX4EDR25.78125 Gbps100 GbpsCX5HDR50 Gbps200 GbpsCX6/CX7NDR100 Gbps400 GbpsCX7/CX8选择哪个代际取决于两个约束GPU服务器的PCIe带宽以及机房预算。比如你用的显卡是PCIe Gen4 x16单GPU的通信带宽上限大概就是64GB/s但一个GPU服务器的IB网卡通常是1-8张如果跑200Gbps的HDR单卡需要PCIe Gen4 x16才能完全喂饱如果服务器还没那么新PCIe Gen3 x16只有约16GB/s的理论带宽跑EDR100Gbps约12.5GB/s就比较合适强行上HDR会受PCIe瓶颈限制。小集群如果就十几台机器QDR/EDR就够用。大模型训练动辄上千卡通信量呈平方级上升此时建议直接HDR起步因为换网的成本远高于一次性上高规格的成本。这一节讨论清楚后面硬件选型才不会走弯路。2. 硬件落地网卡、线缆、交换机的选型与拓扑IB网络不是一个单点设备它是一条完整链路服务器里的HCA卡即IB网卡→ 线缆/光模块 → IB交换机 → 返回。任何一环不匹配最终性能都会打折扣。2.1 主机通道适配器HCA与网卡选择的坑HCA是服务器端接入IB网络的设备主流是NVIDIA原Mellanox的ConnectX系列。选型时第一要注意很多ConnectX卡是双协议卡同一块硬件既能跑IB也能跑以太网RoCE通过固件模式切换。但市面上也有纯以太网版本后缀常带EN比如ConnectX-5 Ex EN它只支持以太网不能切到IB模式。第二要注意的是端口形态。HDR 200Gbps的网卡通常是单端口QSFP56EDR 100Gbps的网卡则是单端口QSFP28或双端口QSFP28。如果你的服务器只有PCIe Gen3 x16建议选EDR级别如果是Gen4 x16或更新的平台可以选HDR。第三别忽视散热和风道。IB网卡的功耗不低ConnectX-6 HDR单卡功耗接近15W到20W大部分卡是被动散热设计靠服务器机箱风道带走热量。有些2U GPU服务器里卡位拥挤如果IB卡插在GPU附近而风道又被电源挡住长时间高负载运行后ibstat会看到链路间歇性Down或者dmesg里出现温度告警。物理位置选不好后面性能优化都是白搭。2.2 线缆和光模块DAC、AOC、光模块怎么选线缆这块我见过太多人在这里踩坑。IB短距连接优先选择无源铜缆DAC3米以内是它的甜区。DAC功耗低、价格便宜、故障率也低插上就能用很多机柜内同交换机连接的场景都选它。距离超过3米就要考虑有源光缆AOC或者可插拔光模块加光纤。AOC线缆两端集成光模块使用简单可插拔光模块则更灵活但要注意模块和线缆的兼容性。HDR交换机的QSFP56端口不要插QSFP28EDR模块然后指望它协商到200Gbps——链路会直接降到EDR速率。反过来EDR交换机端口插HDR模块可能根本无法识别。光模块市场水很深。买非正规渠道的白牌模块便宜是便宜但在NVIDIA交换机上经常出现不识别、误码率高的问题。经验是在IB这种需要无损流控的环境里模块尽量选与交换机同品牌的兼容列表项或者至少确认它符合MSA多源协议否则排查链路误码会消耗大量时间。线缆接好后用命令验证一下物理链路状态具体验证方法在第四章会讲。2.3 拓扑规划从两台机到胖树小规模集群几台机器可以用一台交换机扁平组网所有节点的IB网卡都连接到这台交换机上形成无阻塞网络。此时没有上行链路的概念所有端口都是一个层级性能最容易保障。当节点数超过单台交换机的端口数就需要引入两层Fat-Tree拓扑Leaf层接服务器Spine层做交换机间的互联。这里有个关键概念叫收敛比Oversubscription Ratio即下行端口总带宽与上行端口总带宽的比值。如果Leaf交换机有40个下行口、只用了8个口做上行收敛比是40比8即5比1。对于分布式训练这种全集群通信密集的场景收敛比大于1会显著拉长AllReduce时间一般建议至少做到1比1到2比1之间。小集群还有另一种做法手工做双机直连IB网卡对IB网卡不经过交换机。这种模式下必须在一端手动启动一个子网管理器否则链路无法协商。双机直连适合测试验证驱动和性能不适合生产。新手可以先从两台机器直连开始练手成本和复杂度最低。3. 服务器侧部署从BIOS到驱动工具链硬件到位后服务器侧的操作顺序会影响后续所有环节。很多人习惯先装系统再插卡导致驱动装完发现设备没枚举其实PCIe通道和BIOS设置应该在插卡阶段就确认好。3.1 插卡前的硬件确认PCIe通道与散热IB网卡所在的PCIe插槽不是能插进去就行。HDR 200Gbps的网卡需要PCIe Gen4 x16EDR 100Gbps至少需要Gen3 x16或Gen4 x8。很多服务器的PCIe插槽共享通道比如主板上第二个x16物理插槽实际只有x8电气通道插上去链路也能通但带宽减半。插卡后用lspci -vvv确认实际链路状态重点关注两个字段LnkCapPCIe插槽能力和LnkSta当前协商结果。正常情况应该看到LnkSta: Speed 16GT/s (gen4), Width x16如果显示Width x8或者Speed 8GT/s那就要检查插槽位置或者BIOS里的PCIe拆分配置。有些厂商服务器默认把PCIe通道按照显卡优先的方式分配IB卡可能拿不到x16。散热方面前面提过被动散热卡依赖机箱风道。插卡时尽量避开GPU直上方的风道死角如果多个IB卡卡与卡之间留出间隔插槽位。部分机箱支持后置硬盘托架改装成IB卡位这种位置风道往往更好。3.2 固件与驱动的安装MLNX_OFED的正确姿势IB驱动安装主流方案是NVIDIA官方MLNX_OFED。它把内核模块mlx5_core、用户态库libibverbs、librdmacm、管理工具ibstat、ibstatus、opensm、perftest都打包在一起比Linux发行版自带的rdma-core更全。安装前先确认内核版本与MLNX_OFED版本兼容。到NVIDIA官网下载对应ISO比如MLNX_OFED_LINUX-5.8-x86_64.iso然后执行mount -o loop MLNX_OFED_LINUX-5.8-x86_64.iso /mnt cd /mnt ./mlnxofedinstall --add-kernel-support--add-kernel-support会让安装器用DKMS方式为当前内核动态编译模块这样后续升级内核时不需要重装全部OFED。如果用的是Ubuntu系统自带rdma-core可能与OFED冲突安装时如果提示检测到已装库建议先卸载系统包再装官方包。装完后重启或者执行/etc/init.d/openibd restart再用ibstat和ibv_devinfo -v确认设备是否识别。此时如果端口状态还是Down别急着怀疑硬件——大概率是子网管理器没起来这个坑我见过太多次了。另外固件如果是出厂旧版本建议找时间用mlxup工具统一升级许多莫名其妙的问题都是固件太旧导致的。4. 没有子网管理器IB链路就是个摆设IB和以太网有一个根本区别以太网交换机会自己学习MAC地址、运行生成树协议插上就能用IB则不同所有端口的状态、LID本地标识符分配、路径计算、故障切换通通依赖一个叫子网管理器Subnet Manager简称SM的角色。没有SMIB链路永远无法进入Active状态。4.1 为什么IB离不开子网管理器可以这样理解IB网络里的交换机和HCA都只是哑设备它们不知道谁连在哪个端口也不知道怎么把数据送过去。SM负责维护整个子网的拓扑数据库给每个端口分配LID然后计算出所有可能的路径并把转发规则下发到每台交换机和网卡。这个机制和以太网的ARP、FDB学习完全不同更像是软件定义网络SDN里的集中式控制器——区别是SM跑在带外或带内的某个主机上它不参与数据转发的数据面路径。ES、虚拟机、普通服务器如果没跑SM那么就算驱动正常端口状态也只会停留在Down或者Init。所以我调试IB的第一个动作永远是先确认SM活着。生产环境里优先在管理节点上运行OpenSM并建议启用主备模式。4.2 OpenSM的部署与主备切换OpenSM是IB子网管理器最常用的开源实现MLNX_OFED自带。首次使用建议先生成默认配置文件opensm -c /etc/opensm/opensm.conf然后以前台模式跑一次观察日志opensm -g日志里如果出现SUBNET UP说明SM已经把整个子网管理起来了。此时再执行ibstatus所有端口应该都变成Active。确认无误后配置成systemd守护进程[Unit] DescriptionOpenSM InfiniBand Subnet Manager Afternetwork.target [Service] ExecStart/usr/sbin/opensm -f /var/log/opensm.log -p /var/run/opensm.pid --config /etc/opensm/opensm.conf Restartalways [Install] WantedBymulti-user.target主备SM的配置OpenSM默认通过priority机制协商数值越大优先级越高。主SM配置priority 15备份SM配置priority 5。启动后备份SM会自动进入Standby状态主SM挂了备份SM会在几秒内接管子网期间链路会闪断一次但对训练集群来说这点中断是可接受的。4.3 分区P_Key配置隔离与安全IB分区的概念类似以太网VLAN用16位的P_Key标记。默认不配置分区时整个子网所有端口都在同一个全分区里互相可见、可通信。多租户环境或者不想让存储流量和训练流量混在一起时就需要配置分区。分区配置在OpenSM的partitions.conf文件里示例如下Default0x7fff, ALL, ALL Partitioncompute, 0x0001, ALL Partitionstorage, 0x0002, ALL配置好之后要在opensm.conf里开启P_KEY_ENABLE1 P_KEYS_FILE/etc/opensm/partitions.confP_Key一旦配置错误最典型的故障是两个节点明明链路正常、IP也通但RDMA通信超时不通。排查时先看两端HCA的P_Key配置是否匹配ibv_devinfo -v中显示的pkey值版本号full member/limited member不一致也会导致问题。5. 性能验证与瓶颈定位用数据说话驱动和SM都正常后就要用实际数据验证链路性能。这一步不能跳过因为很多问题在能通的阶段根本看不出来只有压测到极限带宽和极限延迟时才会暴露。5.1 perftest工具集从Hello World到带宽测试perftest是IB性能测试的事实标准包含ib_write_bw、ib_read_bw、ib_send_bw、ib_write_lat等工具。使用方式是两端各起一个进程Server端先运行ib_write_bw -d mlx5_0 -x 0 -FClient端再运行ib_write_bw -d mlx5_0 -x 1 192.168.10.10 -F这里-d指定设备名-x指定绑定的CPU编号-F是强制刷新配置避免缓存过时数据。ib_write_bw衡量的是RDMA写操作ib_read_bw则是读操作两者的方向不同性能有时会有差异建议都测一遍。多流测试用-Q参数设置QP队列对数量比如-Q 16表示开16个QP并发。单流带宽往往受限于CPU频率和PCIe延迟多流才能顶到线速。测试结果中的BW average那行单位是Gbits/secHDR链路理想值在190Gbps以上EDR链路在95Gbps以上低于这个值就需要排查。5.2 延迟测试和带宽测试的实际数字延迟测试用ib_write_latib_write_lat -d mlx5_0 -x 0 -F ib_write_lat -d mlx5_0 -x 1 192.168.10.10 -FHDR交换机环境下单跳RTT延迟通常在1.1到1.5微秒之间EDR会略高一点但差别不大。如果看到延迟在3微秒以上先怀疑CPU节能模式cpufreq governor不在performance档和中断绑定问题再检查是否有严重的拥塞丢包。实测数据给个参考我测试过HDR交换机加ConnectX-6的组合16QP并发ib_write_bw能跑到194Gbps延迟1.2微秒左右中途换过一次杂牌AOC线缆带宽直接掉到120Gbps延迟涨到2.8微秒换回原厂线缆后立刻恢复。线缆对IB性能的影响就是这样立竿见影。5.3 性能不达标时的定位链路当perftest数据不达标时不要拍脑袋按下面顺序逐层定位第一层ibstatus确认端口速率和宽度比如HDR应该是Rate: 200 Gbps。第二层lspci -vvv确认PCIe速度x8就会限制在100Gbps左右x4更惨。第三层确认CPU绑核和NUMA距离这个放到下一章详述。第四层检查线缆和光模块。可以在两端跑ib_write_bw -a用小报文测时延是否异常如果小报文时延也高重点排查物理层。perfquery也可以用来读取IB性能计数器比如每端口接收字节、包数以及丢包计数。两个端都跑起来对拍数据很快就能定位到是哪一端的计数在增长。6. 系统侧深度调优把最后10%榨出来很多IB网络能通但跑不满带宽问题不在网络本身而在服务器侧的资源调度。CPU绑定、中断亲和性、内存就近这三个因素对IB性能的影响之大超过不少人的预期。6.1 CPU绑定与NUMA感知现代服务器是多路CPU每个CPU对应一个NUMA节点本地内存访问比远端内存快得多。IB网卡插在哪个PCIe插槽通常就归属于某个NUMA节点。lspci命令里能看到网卡的NUMA节点信息lspci -vvv -s 03:00.0 | grep NUMA如果网卡在NUMA node 0而perftest进程绑定到了NUMA node 1的CPU核那么内存访问要走QPI/UPI总线带宽和延迟都会受到影响。正确做法是用numactl同时绑定CPU和内存numactl --cpunodebind0 --membind0 ib_write_bw -d mlx5_0 -x 0 -F这里-x 0指定线程固定在CPU 0上与--cpunodebind0保持一致。多卡多进程场景每个进程都要绑定到对应网卡所在NUMA节点的核不能偷懒让内核自由调度。我在实际测试中看到不绑NUMA的情况下HDR带宽可能从190Gbps掉到150Gbps延迟从1.2微秒涨到2微秒以上。6.2 中断亲和性与irqbalance的影响IB网卡收发数据会产生大量中断。默认情况下Linux的irqbalance服务会动态调整中断到不同CPU这个机制在低流量时能平衡负载但高吞吐场景下中断在CPU之间频繁迁移会导致缓存失效和调度延迟。生产环境建议针对IB网卡关闭irqbalance的干扰。你可以保持irqbalance运行但排除mlx5相关中断也可以直接停掉irqbalance然后把网卡中断手动绑到NUMA本地的CPU核上。查看网卡中断号和名称cat /proc/interrupts | grep mlx5然后对每个中断号设置亲和性echo 1 /proc/irq/86/smp_affinity这里1是CPU 0的位掩码。如果中断较多可以在NUMA node 0的几个核之间分散比如核0到核7掩码fc。注意不要绑定到hyper-threading的兄弟核上否则效果反而下降。6.3 IPoIB、MTU与协议栈参数细调IB网络可以承载IP协议叫IPoIB。如果你用ping 192.168.10.1来测试IB网络那是走IPoIB路径测的是IP协议栈性能不是RDMA原生性能。IPoIB下可以通过ifconfig ib0 mtu 65520开启connected mode减少IP包分片在测试场景能看到明显提升。对于RDMA应用IPoIB的MTU不影响verbs接口的性能但要注意两端HCA的MTU必须一致不一致时SM可能协商成最低值。可以这样查看当前端口MTUibportstate -G 0x... -D 1 1 | grep MTU如果跑的是存储集群还需要给RDMA内存池分配足够的锁定内存。RDMA需要把用户态内存钉在物理内存里如果socket缓冲或mlock受限性能会下降或直接报错改一下limitsulimit -l unlimited另外cpu governor要设为performance模式否则CPU降频会直接影响单流性能。cpupower frequency-set -g performance可以临时设置持久化需要配置到启动脚本。7. 实战踩坑实录五类高频问题复盘下面这些案例都是我在不同集群上真实遇到过的每个都花了不少时间才定位写出来当作对照表希望帮你跳过这些坑。7.1 端口Down九成是SM没起来症状ibstatus显示State: Down、PhysState: Down或者反复在Init和Active之间跳。多数人的第一反应是换线、换卡、刷固件折腾半天没效果。排查链路先确认SM进程是否活着ps -ef | grep opensm再看/var/log/opensm.log尾部有没有异常。如果SM根本没跑端口怎么可能Active其次是看SM所在主机和其他HCA之间是否可以互通SSH能通不代表IB子网拓扑正常。另一种情况是SM起了但没检测到目标端口。此时用ibnetdiscover看子网拓扑视图目标设备是否出现。如果拓扑视图里缺了某台机器多半是线缆物理连接问题。我见过交换机端口被禁用的情况在NVIDIA交换机上执行enable port开回来即可。7.2 链路Rate不对最终协商低一档症状HDR卡接了HDR交换机但ibstatus显示Rate: 100EDR达不到200。根因基本有这几种线缆/模块不支持HDR比如用了QSFP28的线端口被强制配置成了低速率HCA或交换机固件太旧速率协商表不完整。逐项排查时先用mlxup把固件刷到最新再看交换机端口配置最后确认线缆支持规格。杂牌线缆标注支持HDR实际里面EEPROM信息写的是EDR这种我在市场上遇到过不止一次。7.3 带宽腰斩PCIe通道不足的锅症状ib_write_bw无论怎么加压带宽始终卡在100Gbps上下上不了200Gbps。Pair端测试还正常说明问题出在服务器本机。排查链路lspci -vvv看到LnkSta: Width x8, Speed 16GT/s那HDR带宽被PCIe Gen4 x8限制约16GB/s就该到头。解决办法是换插槽或者BIOS里调整PCIe lane分配把更多通道分给IB卡。另外如果服务器用了PCIe switch芯片转接IB卡测试出的性能可能也不稳定因为总线下行带宽是共享的。7.4 GPU Direct不生效拓扑感知没对齐症状NVIDIA训练框架里启用了GPUDirect RDMA但性能提升不明显nvidia-smi topo -m显示GPU和IB卡之间的P2P链路是PHB或NODE而不是NV/PIX。GPU Direct要求GPU和IB网卡在同一PCIe Root Complex下或者至少经过同一颗PCIe Switch数据才能做P2DMA而不经过CPU。服务器的物理拓扑决定了这个距离BIOS配置能影响部分拓扑感知但不能突破物理限制。选型阶段最好先确认GPU服务器厂商的拓扑文档把IB卡插在靠近GPU的PCIe Switch下面而不是插到另一个CPU的PCIe Root Complex。UCX环境变量UCX_TLSrc,self,cuda_copy或者UCX_TLSrc,self,cuda_ipc也能影响最终传输路径调试时用ucx_info -f验证配置。7.5 连接超时与重传从perftest日志反推症状perftest跑了一段时间后连接断开报Connection timed out或者Retry count exceeded重跑又能通过但反复随机出现。这种问题通常指向物理层不稳定优先级最高的怀疑对象就是光模块和线缆。排查动作在两端同时跑ib_write_bw观察丢包计数perfquery读取接收端的错误计数如果Symbol Error或者Link Error Recovery计数持续增长说明物理层有误码。换线测试是最快的验证手段别舍不得光模块/线缆异常在IB环境里很常见。另外检查交换机端口的错误计数。NVIDIA交换机上查看端口错误计数需要登录交换机shell命令类似show counters。如果只是某一根线缆的问题端口计数立刻会暴露出来。8. 最后分享一个运维习惯线缆标签与端口映射这篇文章写到这里该讲的技术点都讲到了。最后聊一个不算技术但救过我很多次的习惯线缆标签和端口映射文档。IB网络调试中最耗时的事情之一就是物理拓扑和逻辑拓扑对不上。交换机上36个端口分别连到了哪些服务器两个Leaf交换机之间的上行线是哪根如果没有清晰的标签出故障时只能靠ibnetdiscover慢慢对一台一台试非常痛苦。我的做法是上电之前先在Excel里画一张端口映射表标明交换机端口号、服务器主机名、IB卡PCI地址、线缆型号和长度物理插线后立即核对一遍。交换机侧给每个端口加上描述服务器侧在/etc/udev/rules.d/里为每张IB网卡设置固定的接口名比如ib0、ib1避免重启后接口名变化。这个习惯让集群的网络故障定位时间从小时级降到分钟级。另外IB网络维护最怕的就是改一处动全网。子网管理器配置、分区配置、线缆调整每次变更前留好备份变更后立刻跑一轮perftest全链路测试确认没问题再进入下一个操作。IB是一个强一致性的系统任何一环不一致都会以最奇怪的方式表现出来而数据和文档就是对付这种不确定性的最好工具。
返回列表