您如何确定负载平衡散列算法(例如 ECMP/LAG)的结果以进行故障排除?

网络工程 故障排除 IEEE-802.1ax 电调 非对称路由 落后
2021-07-05 00:51:18

在许多体系结构中,存在各种接口之间的负载平衡机制,例如 ECMP 路由或 LAG。这种负载平衡通常是每个流的,基于各种标准的散列,例如源/目标地址、协议、端口信息等。我想知道的是,你如何解决像这样的非确定性路由情况?

例如,在流量仅采用一条路径的确定性路由方案中,可能会出现数据包丢失或链路延迟增加的情况,识别这种情况相对容易。如果这发生在非确定性路由场景中,我想识别特定成员接口的问题可能很难辨别。

显然,在正常情况下,不需要这样做,但我想知道在 Cisco IOS(XE、XR 等)或 JunOS 等平台上是否有任何命令可以揭示散列结果算法,或者如果有人对此类问题有经验并有特定的故障排除方法。

谢谢

3个回答

在某些情况下有一些事情需要测试,但基本思想是 PAgP 或 LACP 聚合是在两个直接连接的设备之间进行的,从一个设备发送到另一个设备的任何内容都会在另一台设备上结束,而不管这些设备的路径如何流动。

Cisco 有一个命令来测试用于端口通道的接口:

您可以根据帧分发策略确定 EtherChannel 中的哪个接口转发流量。发出远程登录切换命令以远程登录到交换处理器 (SP) 控制台,以便做出此决定。然后,发出 test etherchannel load-balance interface port-channel number { ip | l4port | mac } [ source_ip_add | source_mac_add | source_l4_port ] [ dest_ip_add | dest_mac_add | dest_l4_port ] 命令。

Cisco 和 Juniper 有各种文档,其中详细介绍了 LACP 的散列算法,主要描述了算法使用了哪些参数,但似乎没有像上述命令那样进行任何特定测试。

我一直在 NX-OS 上使用此命令,在一组 N3K-3164Q 上:

switch# show routing hash <srcIP> <dstIP> ip-proto <protocolNumber> <srcPort> <dstPort> vrf <vrfName>

它有助于深入了解 ECMP 极化问题。

对于 ECMP,您可以根据 ICMP 错误跟踪路由。

TTL 不包含在散列算法中,因此只要您保持包含在散列中的字段一致,您就可以通过发送具有增加 TTL 的数据包并监视返回的 ICMP 错误来跟踪路由。

Facebook 编写了一个用于 ECMP 场景的专业 traceroute 工具,该工具在一系列源端口上循环以执行不同的路由并报告每跳每条路由的数据包丢失。

https://github.com/facebook/fbtracert

然而,这对 LAG 不起作用,因为 L3 跃点对于所有路径都是相同的。