免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

AI网络为何敢于包级喷洒?解析Packet Spraying的代价与收益

AI网络为何敢于包级喷洒?解析Packet Spraying的代价与收益 很多做网络的朋友第一次听到 Packet Spraying 这个词脑子里都会冒出一个疑问把同一条流的包拆散到不同路径上那不乱序了吗在传统数据中心里这几乎是禁忌——TCP 遇乱序会重传、会降窗网络再快也白搭。但到了 AI 网络里风向变了越来越多团队把一条流拆成碎片撒出去当成优化链路利用率的正路。这篇文章就从我自己的观察和实操积累出发聊聊为什么偏偏是 AI 网络敢这么干以及真正落地时哪些指标和坑是躲不开的。1. 传统按流哈希的困境AI 流量凭什么让老办法失灵1.1 按流哈希到底在保护什么传统数据中心做负载均衡最常用的方案是 ECMP等价多路径核心逻辑听上去很合理一条流的报文打上一个哈希值哈希值相同的所有包永远走同一条路径这样每条流的报文在接收端严格有序协议栈完全不用考虑乱序。这个设计保护的核心只有一个——传输层对乱序的极度敏感。TCP 对乱序的反应非常激烈。我见过不少排查案例一条正常情况下 2ms 延时就能跑完的消息因为中间出现 3 个乱序包接收端触发了快速重传发送端窗口减半整体吞吐直接掉了 30%。所以传统网络里工程师宁可忍受链路空着也不愿意冒乱序的风险。但这里有个代价哈希是按流决定的而不是按链路实时负载决定的。什么意思呢假设一个 4 条链路的端口组两条大型数据流恰好哈希到同一条链路上这条链路立刻拥塞而另外三条链路却在闲逛。对传统业务来说这种不均衡经常是可以容忍的因为绝大多数流量是小流单条流占不满链路统计复用一下情况不会太离谱。1.2 AI 训练流量恰好踩中了 ECMP 的死穴AI 网络里的流量和普通 Web 流量完全不同。以分布式训练最典型的 AllReduce 为例几千张 GPU 在每轮迭代结束时要同步梯度所有节点同时把数据发出去形成一波又大又同步的大象流。这些流持续时间长、速率高而且多到足以覆盖整个拓扑的所有端口组。在这种流量模型下按流哈希的问题就非常致命了。两个大流一旦哈希冲突撞在同一条链路上带宽立刻减半整轮的梯度同步时间直接拉长。更麻烦的是AI 训练是迭代式的每一轮通信模式几乎完全相同所以同一个哈希冲突会一轮又一轮地重复出现不是偶发而是结构性故障。我这里有一个真实的对比数据某个 32 卡训练任务原网络用传统 ECMP多路径负载不均最忙链路利用率 92%最闲链路只有 41%训练平均迭代时间 6.8 秒后来在测试环境换成包级喷洒策略最高链路利用率降到 63%最闲链路拉高到 57%迭代时间降到 4.9 秒。效果非常直观这就是为什么越来越多 AI 网络团队开始琢磨把流拆碎。2. Packet Spraying 的核心思路把流拆碎到底是什么意思2.1 转发粒度从流降到包Packet Spraying 的思路一句话能说清楚不再关心这条流属于谁每一个数据包到达交换机时独立选择一条可用路径发出去可以是轮询、可以是随机、也可以根据实时队列长度做最短路选择。这个转变的本质是转发决策粒度变了。按流哈希的粒度是一条流而喷洒的粒度是一个包。粒度变小之后任何一条大流都不再独占一条链路而是均匀地被分摊到所有可用链路上链路利用率的标准差会被大幅度压下来。打个生活化的比方传统 ECMP 是给每个旅行团固定一辆大巴一个团的人始终坐在同一辆车上。问题是如果两个超大旅行团被分到同一辆大巴这辆车会爆满旁边车辆却空着。Packet Spraying 则是把所有人都拆散成散客每个人到车站后看哪辆车人少就上哪辆最终每辆车的载客率会相对均衡。2.2 喷洒不是瞎撒调度策略决定天花板很多人误以为 Packet Spraying 就是随机选路径其实不是。真正工程可用的喷洒策略一般分三种第一种是轮询策略包 0 走链路 A包 1 走链路 B包 2 走链路 C简单可靠但缺点是不考虑实时拥塞某条链路如果因为临时拥塞导致队列变长新来的包依然会被分配过去。第二种是随机策略每个包独立随机选一条路径实现成本低但在链路数量少的时候随机性本身会带来新的不均衡比如 4 条链路里可能有 6 个包挤到同一条的情况需要靠大数定律来收敛。第三种是基于负载感知的策略交换机实时观察每个出口端口的队列深度把报文调度到当前队列最短的那条路径上。这种方式效果最好但需要芯片支持通常出现在可编程交换机或高端智能网卡方案里。所以拆碎撒出去这句话背后真正决定收益的是调度策略。建议做技术选型时优先看设备支不支持负载感知喷洒不支持的场景用轮询也能解决绝大多数不均问题。3. 乱序问题拆解拆流最大的代价AI 网络怎么扛3.1 乱序为什么在传统网络里是不可接受的既然一条流的包走的是不同链路每一条链路的转发延时、队列排队情况都不同到接收端时包的顺序必然会被打乱。对 TCP 来说接收端一发现乱序就会把后续已经到的包塞进重排缓冲区同时通知发送端这里有空洞重传计时器也在走一旦重传超时阈值被触发大量包会被重传吞吐瞬间崩掉。RDMA 的情况更特殊。RoCEv2 走的是 UDP 封装没有 TCP 那套自适应拥塞控制它默认底层网络是基本可靠的靠的是无损网络中 PFC 暂停帧来防止丢包。乱序对这种机制的冲击更大因为接收方网络接口必须把乱序包重新排好再交给 GPU如果重排缓冲区不够就只能丢弃一旦丢弃又会触发 Go-Back-N 重传一大批数据被重新发送网络效率暴跌。所以传统观点是不到万不得已不要碰包级负载均衡。这也是早期很多工程师一听喷洒就摇头的原因。3.2 AI 网络愿意为乱序买单的几个理由但 AI 网络有几个天然条件让乱序代价被降到了可控范围。第一拓扑以 leaf-spine 为主路径数有限单跳链路延时非常低各路径的传播延时几乎一致乱序的窗口通常只有几十微秒不会出现跨区域那种巨大延时差。第二AI 训练流量是周期性和可预测的通信模式每轮都相似即使出现乱序重排缓冲区需要覆盖的窗口是稳定的可以提前把 buffer 配足不用应付随机突发。第三这也是最关键的一点AI 训练的上层应用对数据最终到达的容忍度远高于普通 Web 请求。集合通信库内部本身就有消息聚合和再分配的逻辑网卡或驱动可以做报文重排不需要 TCP 那样的端到端语义。我实践时的经验是只要把接收端重排缓冲区配到带宽时延积的两倍以上并把无丢包优先级队列的 PFC 参数调好RoCEv2 下面跑包喷洒基本不会翻车。真正容易翻车的反而是传统 TCP 业务混跑场景这个后面单独讲。3.3 Flowlet 是折中的撒法但 AI 流量要慎用工程上还有一种折中方案叫 Flowlet Switching。它把一条流按照时间上的空闲间隙切成很多小段如果同一流相邻两个包间隔超过某个阈值比如 100 微秒就认为它们属于不同的 flowlet可以为下一个 flowlet 重新选路径。这个方案的优点是同一个 flowlet 内部仍然保持严格保序乱序率比包喷洒低得多链路利用率又比 ECMP 高。但我必须泼一盆冷水AI 训练的大象流往往是连续发送、很少出现超过阈值的长间隙一条 AllReduce 大流可能整个生命周期里都切不出几个 flowletFlowlet 方案在 AI 场景下经常退化成了 ECMP。如果要用 Flowlet必须主动在发送端把大流做突发间隔控制例如在网卡驱动或集合通信库层把人为的发送间隙拉大。这会让网络规划变复杂所以我个人倾向在纯 AI 网络里直接用包喷洒而在混合业务网络里保留 Flowlet。4. 实操落地AI 网络里启用 Packet Spraying 必须盯住的几个环节4.1 动手前先回答三个问题别急着改配置。我每次帮团队做这类优化都会先让他们回答三个问题你的流量模型是纯分布式训练还是混跑存储和普通业务交换机芯片支不支持按包转发而不重排接收端网卡有没有足够的乱序重排能力第一个问题决定能不能用包喷洒。如果混跑环境里有大量 TCP 交互流量我建议先做分段隔离给 AI 流量单独建一张逻辑网络否则你会被 TCP 重传问题活活拖死。第二个问题决定设备选型。传统商用交换芯片大多默认做 per-flow 哈希要支持 per-packet 转发需要开启厂商的增强负载均衡功能或者使用可编程数据平面方案。买设备之前一定要确认清楚这个特性通常不是默认开放的。第三个问题决定端侧要不要调。以 NVIDIA ConnectX 系列为例网卡默认的乱序容忍深度有限如果是几十 GB 级别的大流喷洒乱序窗口会暴增必须调整接收队列的缓存参数。4.2 配置与参数我实测下来最关键的五项在确认上面三个问题后我一般会按下面顺序做配置和验证。第一关闭或绕过 per-flow 哈希开启 per-packet 转发模式。这项工作一般在交换机端口组策略里完成注意要以端口组为单位不能只在单端口开启否则报文很可能在入口就被哈希到同一个内部管道。第二配置喷洒调度策略为轮询或队列感知模式。队列感知模式需要芯片支持开启后我建议把队列深度采样周期调到 1 微秒以内采样太粗会导致调度决策滞后。第三设置无丢包优先级和 PFC 参数。包喷洒会让流量瞬时分布更均匀但一旦出现某个方向瞬时时延偏大PFC 暂停帧触发频率会升高。我当时把 PFC 的 on/off 阈值各放宽了 20%整体暂停帧计数反而下降了因为链路拥塞点被消除了。第四收端网卡侧开启乱序重排并把重排缓冲区深度配到 BDP 的两倍。以 200Gbps、2 微秒 RTT 为例BDP 大约是 50KB两倍就是 100KB单流缓冲区配到几百 KB 就能覆盖绝大多数喷洒场景。第五监测链路利用率标准差和乱序包计数。这两个指标一个代表负载均衡程度一个代表乱序代价。我的经验是链路利用率标准差低于 10%乱序比例低于 0.1% 时训练性能基本不受影响。4.3 别忘了上层集合通信库的配合网络层做喷洒只是半边天。NVIDIA NCCL、华为集合通信库这类上层库通常有自己的一套并行拆分逻辑它们会把一个大消息切成多个 chunk 并行发送本身就相当于在端侧做了流拆分。如果网络侧再做一次包喷洒两者叠加效果是 112 还是相互干扰需要实测。我这里分享一个反面教训。之前一个测试环境网络层包喷洒已经调好训练性能提升了 20%。后来有人把 NCCL 的并行 chunk 数调大结果乱序率直线飙升性能反而比初始基线还差。原因很简单端侧并发太多单条链路的瞬时排队加剧重排缓冲区被击穿。正确做法是配合调优开了网络包喷洒后集合通信库的并行度应从默认值先降 30% 左右观察乱序率和迭代时间曲线再逐步调整找到网络侧和端侧的平衡点。5. 常见问题与排查技巧实录5.1 现象一喷洒后乱序率暴涨这是最常见的翻车现场。先确认是不是重排缓冲区太小用网卡自带的计数器看 drop 和 reorder 事件如果重排 buffer 从 128KB 加到 512KB 之后乱序率明显下降说明就是这个原因。如果 buffer 已经够大但乱序率依然高就要检查是不是多路径时延差过大比如 leaf 到 spine 之间的某条链路被打满队列延时飙起来导致同一流在两个路径上的时延差超过几十微秒。排查手段是用交换机命令行查看每条链路的队列深度找出瞬时队列最高的那条链路。如果单条链路持续拥塞说明上游喷洒策略还是没有完全解决哈希冲突只是把问题从流级冲突变成了包级瞬时冲突。这时候优先看喷洒调度是不是轮询模式换成负载感知模式通常能压下去。5.2 现象二链路利用率依然倾斜如果做了包喷洒但各链路利用率还是不均衡优先排查是不是部分链路的出入口接入带宽不一致比如 4 条 100G 链路中有一条实际协商成了 40G速率不匹配自然导致负载倾斜。另一个容易忽略的是交换机内部哈希在入口阶段就把包拆分到了固定的内部队列后面无论怎么做喷洒都是无用功。我曾经被这个问题困扰过两三天。现象是 spray 已开启但始终有一条链路利用率高 20%。最后发现是上一任工程师在某条链路上加了端口镜像流量镜像流量吃掉了 30% 带宽。把镜像清理掉之后利用率立即回归均衡。所以做喷洒调优前先检查有没有额外的镜像、采集、ACL 计数等隐藏流量在干扰计算结果。5.3 现象三与 TCP 业务混跑时重传增多如果网络里除了 AI 流量还有传统 TCP 流量包喷洒会大概率导致 TCP 重传率上升。原因前面提过TCP 对这种乱序几乎零容忍。我的处理思路是不要试图在网络层做区分而应该用 QoS 队列或 VRF 把两类流量彻底隔开AI 流量走包喷洒的绿色通道TCP 业务流量仍然走传统 ECMP。在 Leaf 交换机上用 ACL 打标记按 DSCP 值分流是非常成熟的做法。如果隔离条件不具备还有一个备选方案对 TCP 流量所在的端口组关闭喷洒特性对 AI 流量所在端口组单独开启。这需要交换机支持按端口组或按 ACL 匹配不同的负载均衡策略不是所有设备都能做到选型时要重点验证。6. 我的实操心得与后续扩展方向我自己做 AI 网络调优几年下来最大的体会是不要神化 Packet Spraying也不要怕它。在纯 RoCEv2 训练网络里它确实是性价比极高的优化手段能把链路利用率从百分之六七十拉到九十以上但它不是开关一开就完事的东西需要端侧、网络侧、上层通信库三方配合。我个人的建议是先在测试环境用小规模训练任务做灰度用 JCT 和乱序率两个指标做判定稳定后再扩大到生产集群。千万不要一上来就把全网都切成喷洒模式那种性能反而下降的案例我见过太多了。另外一个让我印象深刻的教训是网络工程师不要只盯着带宽利用率更要看训练任务的实际迭代时间这才是 AI 业务真正关心的结果指标。后续如果你有兴趣还可以沿着两个方向继续深挖一是结合可编程交换机做负载感知的包级调度把实时队列信息引入转发决策二是在网卡侧做智能重排让乱序重排的算力从 CPU 卸载到 RDMA 网卡进一步降低端到端延迟。这个领域现在还在快速演进能做的事比想象中多很多。
返回列表