我一直在网上搜索我遇到的这个问题。它在某种程度上与这个问题类似:第 3 层 LACP 目标地址哈希算法具体是如何工作的?
我的设置如下:我有一个中央交换机,Procurve 2510G-24,镜像版本 Y.11.16。它是星型拓扑的中心,有四台交换机通过单个千兆链路与其相连。这些交换机为用户提供服务。
在中央交换机上,我有一台具有两个千兆接口的服务器,我想将它们绑定在一起以实现更高的吞吐量,另外两台服务器与交换机有单千兆连接。
拓扑结构如下:
sw1 sw2 sw3 sw4
| | | |
---------------------
| sw0 |
---------------------
|| | |
srv1 srv2 srv3
服务器运行的是 FreeBSD 8.1。在 srv1 上,我使用 lacp 协议设置了一个 lagg 接口,在交换机上,我也使用 lacp 为两个端口设置了中继。交换机显示该服务器是 lacp 伙伴,我可以从另一台计算机 ping 该服务器,并且该服务器可以 ping 其他计算机。如果我拔掉其中一根电缆,连接仍会继续工作,所以一切看起来都很好。
直到我测试了吞吐量。srv1 和 sw0 之间只使用了一条链路。所有测试均使用 iperf 进行,并使用 systat -ifstat 检查负载分布。
我希望测试接收和发送操作的负载平衡,因为我希望此服务器成为文件服务器。因此有两种情况:
- 在 srv1 上运行 iperf -s,在其他服务器上运行 iperf -c
- 其他服务器上运行 iperf -s,而连接到所有其他服务器的 srv1 上运行 iperf -c。
每次只使用一条链路。如果拔掉一条电缆,连接仍会继续。但是,一旦重新插入电缆,负载就不会分散。
每台服务器都能够填满千兆链路。在一对一测试场景中,iperf 报告的速度约为 940Mbps。CPU 使用率约为 20%,这意味着服务器可以承受两倍的吞吐量。
srv1 是戴尔 poweredge sc1425,带有板载英特尔 82541GI 网卡(freebsd 上的 em 驱动程序)。在解决了 lagg 接口上的 vlan 标记问题后,发现 em 无法支持此功能。因此,我认为 em 驱动程序和/或 lagg 堆栈可能存在其他问题,因此我在同一台服务器上启动了 backtrack 4r2。
因此,srv1 现在使用 Linux 内核 2.6.35.8。我设置了一个绑定接口 bond0。内核模块加载了选项 mode=4 以获取 lacp。交换机对链接很满意,我可以 ping 通服务器。我甚至可以将 VLAN 放在绑定接口之上。
然而,问题只解决了一半:
- 如果我使用 srv1 作为其他服务器的客户端,iperf 将报告每个连接的速度约为 940Mbps,而 bwm-ng 当然会显示两个网卡之间的负载分配很好;
- 如果我在 srv1 上运行 iperf 服务器并尝试连接其他服务器,则不会进行负载平衡。
我想可能是我运气不好,两个客户端的 mac 地址的哈希值相同,所以我引入了两台新服务器,并同时对其中四台进行了测试,但仍然没有任何变化。我尝试禁用并重新启用其中一个链接,结果只是流量从一个链接切换到另一个链接,然后又切换回第一个链接。我还尝试在交换机上将中继设置为“普通中继模式”,并尝试了其他绑定模式(roundrobin、xor、alb、tlb),但我从未看到任何流量分布。
不过,有一件有趣的事情:
四台交换机中的一台是 Cisco 2950,镜像版本为 12.1(22)EA7。它有 48 个 10/100 端口和 2 个千兆上行链路。我有一台服务器(称为 srv4),它连接了 4 通道中继(4x100),FreeBSD 8.0 版本。交换机通过千兆连接到 sw0。如果我在连接到 sw0 的其中一台服务器上设置 iperf 服务器,并在 srv4 上设置客户端,则所有 4 条链路都被使用,iperf 报告的速度约为 330Mbps。systat -ifstat 显示所有四个接口都被使用。
cisco 端口通道使用 src-mac 来平衡负载。根据手册,HP 应该同时使用源和目标,因此它也应该可以正常工作。这是否意味着 HP 固件中存在一些错误?我做错了什么吗?