通过多个 NIC 路由 ECMP 负载平衡,将流量集中到一个接口

通过多个 NIC 路由 ECMP 负载平衡,将流量集中到一个接口

我在一台带有 2 个 10Gb NIC 的服务器和它通过两个 /30 网络连接到的 L3 交换机之间建立了一个功能齐全的 ospf 邻接。为 lo 接口分配了一个 /32 IP 地址,该接口可 ping 通并可靠地传输流量。

然而,通过 tcpdump 测试 ecmp 时,我看到流量要么被固定到一个接口,要么被复制到两个接口,具体取决于目的地。更重要的是,同级服务器的配置类似,但具有另一个环回 IP 地址,流量被固定到一个 NIC。

路由表中的路由,特别是对等服务器,都显示同等权重的接口,但并未达到在每个服务器之间实现 >10Gbps 吞吐量的预期结果。

至少,我希望看到由于 CPU 开销而导致的糟糕的 <10Gbps 性能,但可以使用两个上行链路的备用路线。

我正在尝试解决 drbd 绑定到 1 个 IP/NIC 的问题,只有一个 10Gbps 链路用于在系统之间同步,同时有 >10Gbps 的潜在 iSCSI 启动器请求。此处的限制因素是对等链路的吞吐量。

default via 10.0.4.1 dev enp9s0f0 proto zebra metric 1

10.0.4.0/30 dev enp9s0f0 proto kernel scope link src 10.0.4.31 metric 107
10.0.4.4/30 dev enp9s0f1 proto kernel scope link src 10.0.4.31 metric 106
10.0.4.8/30 via 10.0.4.1 dev enp9s0f0 proto zebra metric 14
10.0.4.12/30 via 10.0.4.5 dev enp9s0f1 proto zebra metric 14
10.0.4.30 proto zebra metric 24
        nexthop via 10.0.4.5 dev enp9s0f1 weight 1
        nexthop via 10.0.4.1 dev enp9s0f0 weight 1

答案1

据我所知,ECMP 和 LACP 都试图固定彼此流动(连接)到单一路径——我相信这是为了避免因重新排序而导致的 TCP 问题。

在 Linux ECMP 中,可以进行调整,sysctl net.ipv4.fib_multipath_hash_policy以仅考虑 IP 地址对(L3 散列)或另外考虑 TCP/UDP 端口对(L3+4 散列)。

更改 sysctl 值1将在两条路由之间分配多个流/连接。

如果仍然不合适,某些类型的 L2 绑定/组合可能会起作用。

相关内容