InfiniBand 网络被设计为无损网络。当出现拥塞时,InfiniBand 的标准做法是不发送数据,除非接收方有足够的空间,而不是丢弃数据包来处理拥塞。
本文讨论了InfiniBand (IB) credit loops以及拓扑和路由算法选择在防止credit loops中的作用。
每个 HCA 端口和 Switch 端口都在链路上的发送方和接收方之间实现credit机制。它是针对每个链路方向以及由物理链路两端的硬件实现的每个虚拟通道 (VL) 实现的。
多个credit“状态机”和每个 VL 的单独缓冲区有助于实现:一个 VL 上的流量不会干扰另一 VL 上的流量。
在 VL 内,一个方向的流量不会干扰相反方向的流量。
当物理链路处于活动状态时,每个 VL 各个方向上的发送方和接收方会持续通信,因此发送方知道接收方该 VL 还剩多少缓冲区空间。可用空间量以“credit”表示,其中credit代表一定数量的字节。如果接收 VL 缓冲区已满,发送方将停止发送数据,直到有更多空间(credit)可用。当接收方报告可用credit为零时,它开始向发送方施加“反压”。
对于 HCA 端口,如果 IB 应用程序消耗数据的速度不够快,credit机制允许相邻交换机停止向服务器发送数据。例如,当代码效率低下、内核崩溃或主机 CPU 过载时,就会发生这种情况。对于来自 HCA 端口的出站流量,credit机制使数据能够保留在主机内存中,直到相邻交换机准备好为止。
在fabric内,如果交换机 S 的端口 P 正在接收来自虚拟通道 X 上相邻交换机 N 的反压,则数据包将被放置在 VL X 传输队列中,目的地是端口 P。如果积累了足够的数据包,交换机 S 将VL X 的接收缓冲区资源耗尽。它将报告 VL X 没有可用的credit,从而对 VL X 的所有端口施加反压。通过这种方式,如果需要,来自fabric中一个端口的反压可以通过fabric传播 — 从目标 HCA 一直传播到源 HCA。
如果反压源持续存在,则在传输队列中等待太长时间的数据包将超时并被丢弃。该队列头 (HOQ) 超时是通过子网管理器指定的。在可靠传输服务上运行的流量由源 HCA 自动重传。此超时过程旨在防止fabric死锁。这也是唯一一次故意丢弃 IB 数据包的情况。
与许多其他网络一样,InfiniBand 不喜欢循环。具体来说,它不喜欢逻辑循环,其中链路反压可能会造成死锁情况。这些被称为credit loops。尽管 HOQ 计时器会定期清除此类死锁,但性能会受到影响。credit loops仅代表潜在的死锁,这取决于循环中每个链路的流量。然而,在 InfiniBand 速度下,如果流量模式正确,这种死锁可能会很快发生。
下图说明了一个非常简单的credit loops。

在这个例子中:
四个 Switch ASIC 以环形拓扑连接。
主机适配器 (HCA) 将服务器(节点)连接到每个交换机,交换机 4 上还有一个附加的 HCA。
其他假设:
路由已由 Minhop 路由算法设置。
所有流量都在同一虚拟通道上发送。
交通格局
节点 A 将消息流式传输到节点 C。
节点 B 流向节点 D。
节点 C 流向节点 A。
节点 E 流向节点 B。
在这种流量模式下,每根 IB 电缆承载两个数据流。
如果由于某种原因节点 D 的应用程序无法接受来自节点 B 的数据包:
HCA D 对开关 4 施加反压
交换机 4 对交换机 3 的链路施加反压
交换机 3 对来自交换机 2 的链路以及 HCA C 施加反压
交换机 2 对 HCA B 施加反压,但由于 A->B->C 流也对其来自交换机 1 的链路施加反压
交换机 1 对来自交换机 4 的链路以及 HCA D 和 E 施加反压
此时,所有HCA都无法发送数据。如果节点 D 没有及时恢复,交换机中的队列头计时器就会到期,所有数据包都会被丢弃。使用可靠传输服务的数据包将被重试。总体而言,延迟和带宽都会受到影响。
以下是 IB credit loops的必要要素:
物理循环。
一组节点到节点的流量路径(在同一 VL 上),其中路径之间存在循环依赖关系。在上图中,子网管理器设置的四个路径具有相互依赖性,如果一个目标停止并且所有路径上的流量足够高,则可能会造成死锁。
注意:每个构成循环依赖的路径都将包含至少三个开关。上图显示了四个路径,每个路径包括三个交换机。
除最小的实用 IB fabric外,所有fabric都存在物理环路。对于torus, mesh, and hypercube等拓扑来说,这一点可能更为明显,但对于标准的“胖树”来说同样如此。从技术上讲,树形拓扑没有环路,但 IB“树”有许多物理环路,除非它们是只有一个 L2(spine/core)交换机的 2 层(又名 Clos-3),例如,如果它们是真正的树。
下图显示了一个小型 Clos-3 fabric。它包含多个物理 4 交换机环路,与上图类似。一个循环被突出显示。我们的目标是防止物理循环变成credit loops。

尽管包含credit loops的轻负载 IB fabric可以长时间运行而不会出现问题,但最佳实践是在fabric设计中消除credit loops。
消除credit loops的最常见技术包括使用:
良好的物理拓扑,包括良好的节点布局
更好的路由算法
多个虚拟通道
其中一些方法会影响系统性能或增加管理成本。
前面的简单循环示例可以通过多种方式摆脱credit loops。四种方式如下图所示:

每个示例拓扑的描述(a 到 d)
消除交换机间连接,例如位于交换机 S2 和 S3 之间的连接,因为它破坏了物理环路,因此不可能出现credit环路。
在相对的交换机之间添加一条电缆,例如在交换机 S2 和 S4 之间,这实际上会创建更多的物理环路。在本例中,它创建了两个新的 3 开关环路。然而,由于所有 IB 路由算法都设计为使用“最短路径优先”,因此该fabric中的所有流量流都是“点对点”的,仅涉及两个交换机。不会有数据流经过第三个交换机。即使 Switch 用完了 VL 缓冲区空间,credit反压也无法传播形成循环死锁。
从一台交换机(本例中为 S2)删除所有节点将消除经过交换机 S1 和 S3 的 3 交换机路径。节点 B 从 S2 移至 S3。在此设计中,3 开关数据通过 S2(在本例中为 A <-> B 或 C)和 S4(A <-> B 或 C 的备用路径)传输。但是,由于最短路径优先路由,子网管理器不会通过 S1 或 S3 提供 3 交换机路径(或 4 交换机路径)。
在这种情况下,物理拓扑不变,但使用Up/Down路由而不是Minhop路由。一台交换机(在本例中为 S1)被定义为根交换机。使用向Up/Down下算法通过禁止路径 S2->S3->S4 和 S4->S3->S2 来打破逻辑循环。有关更多信息,请参阅了解上/下 InfiniBand 路由算法一文。
消除物理环路,或包含足够的具有三个或更多开关的路径,以便不会形成依赖循环
此方法的一个实际示例适用于 2 层 (Clos-3) fabric,其中最佳实践是将服务器连接到 L2 交换机。以下是具有credit loops的 Clos-3 的示例。请注意,删除节点 X 和 Y 会破坏所有循环:

注意:Clos-3 fabric中 L2 的 IB 网关是一个例外,因为它们交换的流量太小,无法完成反压环路。其他之间不交换大量数据的节点也可以放置在 L2 上,即使它们与 L1 节点的连接可能是高带宽的。另请参阅VPI 网关注意事项。
可以使用三种常见的 IB 路由算法:
最小跳数 (minhop)
上/下 (updn)
胖树(ftree)
注意:其他路由算法不太常见,并且超出了本文的范围。
Minhop并 不能消除credit loops。与所有 IB 路由引擎一样,它从最短路径生成树开始,并尝试跨可用物理链路静态平衡所有可能的逻辑路径(在每个节点对之间)。它完全连接所有可达的节点。因此,如果物理网络首次启动、正在修改或因链路或交换机故障而降级,Minhop 是一个很好的默认算法。对于正确设计的 Clos-3 网络(两层交换机 ASIC),其中credit loops已通过物理连接消除,Minhop 对于生产集群来说是一个可行且简单的选择,但不适用于 Clos-3 之外的任何网络。
它保证不会出现credit loops。
它对非经典“胖树”的拓扑具有相当的容忍度,例如在组合以前独立的 IB 集群时。
建议使用路由链功能为每个组合的IB集群提供最佳路由。
如果您使用Up/Down算法,则需要使用一个小的 SM 配置文本文件来定义fabric的“根”交换机。由于该算法不允许某些逻辑路径来打破循环,因此某些节点可能无法相互“ping”,除非遵循 Up/Down 算法的最佳实践。
胖树路由是Up/Down路由非常相似。与 Up/Down 算法一样,它接受根交换机列表并保证无环路逻辑拓扑。然而,Fat Tree 只能布线对称(纯)和近对称的胖树,因此它对于更具创意的树状fabric没有用处。通过关注近乎纯粹的胖树,胖树算法可以对逻辑路径进行更多的全局平衡。因此,由于 up/Down 具有更多的本地平衡,因此它的路由比 Up/Down 提供的路由更有效。
注意:Up/Down 和 Fat Tree 算法都尝试在没有根交换机列表的情况下进行操作。不建议在没有根交换机列表的情况下使用 UP/Down,因为不能保证正确自动检测根交换机。胖树只能在纯理论上的胖树拓扑中运行,无需根交换机列表。否则就会失败。当胖树算法明确知道根时,它会减少对其可路由到的拓扑的限制。
其他技术超出了本文的范围。请注意,用于超立方体和增强型超立方体的 DOR 和 Torus2QoS 算法(适用于 2d 和 3D 网格和圆环拓扑)是无credit loops路由引擎。