我看到了有关 Linux 下绑定接口的一些令人困惑的行为,我想把这种情况说出来,希望有人能帮我澄清一下。
我有两台服务器:服务器 1 (S1) 有 4 个 1Gbit 以太网连接;服务器 2 (S2) 有 2 个 1Gbit 以太网连接。两台服务器都运行 Ubuntu 12.04,但内核为 3.11.0-15(来自 lts-saucy linux-generic 包)。
两台服务器均将其各自的网络接口捆绑到单个 bond0 接口中,其配置如下(在 中/etc/network/interfaces
):
bond-mode 802.3ad
bond-miimon 100
bond-lacp-rate fast
bond-slaves eth0 eth1 [eth2 eth3]
服务器之间有几个 HP 交换机,我认为它们在相关端口上正确配置了 LACP。
现在,链接正常工作 - 网络流量顺利地往返于两台机器。并且所有相应的接口都在使用中,因此聚合并非完全失败。但是,我需要这两台服务器之间尽可能多的带宽,而我并没有获得我期望的 ~2Gbit/s。
在我的测试中,我观察到每个服务器似乎将每个 TCP 连接(例如 iperf、scp、nfs 等)分配给单个从属接口。基本上所有连接的最大限制似乎为 1 千兆位。
通过设置bond-xmit-hash-policy layer3+4
,我可以使用iperf -c S1 -P2
在两个从属接口上发送,但在服务器端,接收仍然只发生在一个从属接口上,因此总吞吐量限制在 1Gbit/s,即客户端在两个从属接口上显示 ~40-50MB/s,服务器在一个从属接口上显示 ~100MB/s。如果不设置,bond-xmit-hash-policy
发送也仅限于一个从属接口。
我的印象是 LACP 应该允许这种连接捆绑,例如允许单个 scp 传输利用两个主机之间的所有可用接口。
我对 LACP 的理解有误吗?还是我遗漏了某些配置选项?任何建议或调查线索都将不胜感激!
答案1
一个简单粗暴的解释是,使用 LACP 的单条通信线路不会将数据包拆分到多个接口上。例如,如果您有一个从 HostA 到 HostB 的单个 TCP 连接流式传输数据包,它将不会跨接口发送这些数据包。最近我一直在研究 LACP 以寻找我们正在研究的解决方案,这是一个常见的误解,即使用 LACP“绑定”或“中继”多个网络接口会为您提供组合接口的“吞吐量”。一些供应商已经制作了专有驱动程序,这些驱动程序将通过多个接口进行路由,但据我所知,LACP 标准并非如此。这是我在搜索类似问题时从 HP 找到的一份不错的图表和解释的链接: http://www.hp.com/rnd/library/pdf/59692372.pdf
答案2
bond-xmit-hash-policy layer3+4
设置从源服务器到交换机的负载平衡。它不会设置从交换机到第二台服务器的负载平衡算法。这几乎肯定仍然是第 2 层或第 3 层平衡,即根本不平衡。
答案3
首先,当您使用团队驱动程序时,这会产生一些开销,并降低预期的最大吞吐量(1GB 适配器上的最大吞吐量约为 940 MB/s)约 10%。
我不确定您有哪种适配器,但如果您使用盒内驱动程序,则设置可能不适合最大吞吐量。您可以考虑添加队列(最多 4 个),因为适配器上的单个队列可能无法达到线速。
另一个考虑因素是,iperf 的一个线程可能无法达到最高速度。对于 1GB,2-6 个线程可能更理想,您可以使用简单的 bash 脚本同时启动多个线程。
对于英特尔 NIC,但 RSS 和硬件 RSC 会影响吞吐量,在 Broadcom 上确保 TOE 正常工作。
但是,第一步是移除 LAG,然后尝试测试每个系统上的 1 个端口的流量,以查看其获得了多少吞吐量,对所有端口执行此操作,然后尝试 2。LACP 的设置很难,我从未尝试在 HP 交换机上设置它,只在 Force10(戴尔之前)上设置过。
另外,为什么有几个开关?