Procurve交换机和服务器之间的负载平衡

我一直在网上search这个问题,我一直有。 它与这个问题类似: 第3层LACP目标地址散列工作到底有多精确?

我的设置如下:我有一个中央交换机,Procurve 2510G-24,镜像版本Y.11.16。 它是星形拓扑的中心,有四个交换机通过一个千兆链路连接到它。 这些交换机为用户服务。

在中央交换机上,我有一个带有两个千兆位接口的服务器,我想将它们连接在一起以实现更高的吞吐量,另外还有两台服务器与交换机具有单千兆位连接。

拓扑结构如下所示:

sw1 sw2 sw3 sw4 | | | | --------------------- | sw0 | --------------------- || | | srv1 srv2 srv3 

这些服务器正在运行FreeBSD 8.1。 在srv1上,我使用lacp协议设置了一个lagg接口,在交换机上我使用lacp为两个端口设置了一个trunk。 交换机显示服务器是一个lacp伙伴,我可以从另一台计算机ping服务器,服务器可以ping其他计算机。 如果我拔掉了其中一根电缆,连接将继续工作,所以一切看起来都很好。

直到我testing吞吐量。 srv1和sw0之间只有一个链接。 所有testing均使用iperf进行,负载分配使用systat -ifstat进行检查。
我正在testing接收和发送操作的负载平衡,因为我想这个服务器是一个文件服务器。 因此有两种情况:

  1. 在srv1上的iperf -s和在其他服务器上的iperf -c
  2. 其他服务器上的iperf -s和连接到所有其他服务器的srv1上的iperf -c。

每次只有一个链接被使用。 如果拔下一根电缆,连接将继续。 但是,一旦电缆重新插入,负载就不会分配。

每个服务器都能够填充千兆位链路。 在一对一的testing场景中,iperf的报告大约是940Mbps。 CPU使用率约为20%,这意味着服务器可以承受吞吐量翻倍。

srv1是一款带有intel 82541GI nics(在freebsd上的em驱动程序)的dell Poweredge sc1425。 在对lagg接口顶部的vlan标记进行故障排除之后,事实certificateem不能支持这个问题。 所以我想,也许其他的东西驱动程序和/或lagg堆栈是错误的,所以我开始在这台服务器上回溯4r2。

所以srv1现在使用linux内核2.6.35.8。 我build立了bond0接口。 内核模块加载了选项mode = 4以获得lacp。 交换机很高兴与链接,我可以ping和服务器。 我甚至可以把vlans放在绑定界面上面。

但是,问题只解决了一半:

  • 如果我使用srv1作为其他服务器的客户端,iperf每个连接的报告大约为940Mbps,而bwm-ng显示的是两个nics之间的负载分配;
  • 如果我在srv1上运行iperf服务器并尝试与其他服务器连接,则没有负载平衡。

我以为也许我运气不好,客户端的两个mac地址的哈希值是一样的,所以我带了两台新服务器,同时testing了四台服务器,但是还是没有任何变化。 我尝试禁用和重新启用其中的一个链接,发生的所有事情是从一个链接切换到另一个链接,再返回到第一个。 我也尝试在交换机上设置干线为“普通干线模式”,并尝试了其他绑定模式(roundrobin,xor,alb,tlb),但是我从来没有看到任何stream量分配。

不过有趣的是:
其中一台交换机是思科2950,镜像版本12.1(22)EA7。 它有48个10/100端口和2千兆上行链路。 我有一个服务器(称为srv4)与4通道中继连接到它(4×100),FreeBSD 8.0版本。 交换机通过千兆位连接到sw0。 如果我在连接到sw0的服务器和连接到srv4的客户机上设置iperf服务器,将使用所有4个链接,并且iperf报告大约330Mbps。 systat -ifstat显示所有使用的四个接口。

cisco端口通道使用src-mac来平衡负载。 惠普应根据手册使用来源和目的地,所以它应该可以工作。 这是否意味着HP固件中有一些错误? 难道我做错了什么?