如何使用bonding驱动程序在Linux上实现2GB的总吞吐量?

对于这个应用程序,我并不关心高吞吐量,而是总吞吐量。 我在服务器端有一个IP地址,我希望能够从服务器发送超过1千兆的stream量。 服务器有两个1千兆位卡,并连接到一对交换机。 该应用程序涉及世界各地的数千个远程客户端连接到服务器(即不是本地networking)。

目前,使用模式5(balance-tlb)build立绑定,但是每个端口的吞吐量不会超过500Mbit / s。 我怎样才能超过这个限制? 请假设我没有访问交换机,所以我不能实现802.3ad。

(我希望添加“绑定”标签,但我不能添加新的标签,所以“团队”)。

在交换机级别没有合作的情况下,实现2吉比特是不太可能的,即使只有一个IP源/目的地组合,也很难实现。 大多数团队都设置了IP散列,为每个源/目的地分配一个NICpath。 因此,你只会得到1吉比特。 有循环scheme,但是你经常可以发现无序的数据包到达,除非主机和目的地都支持这个scheme,否则这是不可取的。

您需要在交换机端口上进行端口聚合 (接入交换机连接到机器上的2千兆位端口的两个端口需要进行聚合)。 但是,一旦达到这个目标,你应该接近2Gbps的path(受机器能力的限制)。

通过匹配绑定驱动程序的逻辑2Gbps端口的交换机上的端口聚合,您将使用机器上只有一个IP地址的多路复用冗余path。

有一些有趣的笔记,我现在看到这里 , 在这里 。

Linux绑定驱动程序的这个奇妙function有一个阴暗面 – 它只适用于允许在打开接口时更改MAC地址的networking接口。 balance-alb模式依赖于迅速的ARP欺骗来愚弄内核,认为这两个物理接口是通过dynamic地重写MAC地址来实现的。 所以接口的驱动程序必须支持这个,其中许多不支持。

但是,这并不是绑定驱动程序所能做的。 模式选项给你七个select,你不必担心接口兼容性。 但是,你需要考虑你的交换机支持什么。 balance-rr,balance-xor和broadcast模式需要将交换机端口组合在一起。 这可以通过各种不同的名字来寻找“中继群”,“以太通道”,“端口聚合”等等。 802.3ad需要交换机支持802.3ad。

首先,你可能知道你永远不会达到2Gb / s。 TCP / IP的开销将会限制你大概90%的最大值。

第二,即使使用TCP卸载引擎,第3层以上的堆栈也会影响瓶颈。 换句话说,你如何传输数据? 我可以有10Gb / s的网卡和它们之间的交叉,如果我通过ssh隧道使用rsync,我不会达到几百Mb / s。

还有什么可以告诉我们关于拓扑? 你说服务器连接到几个交换机,远程客户端遍布世界各地。 你有> 500Mb / s(聚合)的广域网连接吗?

我们并没有真正解决这个问题。 我们所做的是设置两台服务器,每台服务器绑定一个IP,然后按照这里的指示强制stream量进出端口:

http://kindlund.wordpress.com/2007/11/19/configuring-multiple-default-routes-in-linux/

稍微修改我们的情况。 在本例中,网关为192.168.0.1,服务器的IP地址分别为eth0和eth1上的192.168.0.211和192.168.0.212:

printf "1\tuplink0\n" >> /etc/iproute2/rt_tables printf "2\tuplink1\n" >> /etc/iproute2/rt_tables ip route add 192.168.0.211/32 dev eth0 src 192.168.0.211 table uplink0 ip route add default via 192.168.0.1 dev eth0 table uplink0 ip rule add from 192.168.0.211/32 table uplink0 ip rule add to 192.168.0.211/32 table uplink0 ip route add 192.168.0.212/32 dev eth1 src 192.168.0.212 table uplink1 ip route add default via 192.168.0.1 dev eth1 table uplink1 ip rule add from 192.168.0.212/32 table uplink1 ip rule add to 192.168.0.212/32 table uplink1