对于此应用程序,我更关心的是总吞吐量,而不是高可用性。我在服务器端有一个 IP 地址,我希望能够从服务器发送超过 1 千兆位的流量。该服务器有两个 1 千兆位卡,并连接到一对交换机。该应用程序涉及全球数千个远程客户端连接到服务器(即不是本地网络)。
目前,绑定使用模式 5(balance-tlb),但结果是每个端口的吞吐量不会超过 500Mbit/s。我该如何突破这个限制?请假设我无法访问交换机,因此无法实现 802.3ad。
(我本来希望添加“bonding”标签,但是我无法添加新标签,所以只能使用“teaming”了。)
答案1
如果没有交换机级别的协作,您不太可能实现 2 千兆位,即使这样,如果只有一个 IP 源/目标组合,也可能会很难实现。大多数团队都设置了 IP 哈希,为每个源/目标分配一个 NIC 路径。因此,您只能获得 1 千兆位。有循环方案,但您经常会发现数据包到达顺序混乱,除非主机和目标都支持该方案,否则这是不理想的。
答案2
你会需要端口聚合在交换机端口(接入交换机的两个端口需要聚合,这两个端口连接到您机器上的 2 个千兆端口)。但是,一旦实现这一点,您应该接近 2Gbps 路径(受机器功能限制)。
通过交换机上的端口聚合与绑定驱动程序的逻辑 2Gbps 端口相匹配,您将使用机器上只有一个 IP 地址的多路复用冗余路径。
我现在查阅这个的时候发现了一些有趣的笔记,这里。
Linux 绑定驱动程序的这一出色功能也有其弊端——它只适用于允许在接口打开时更改 MAC 地址的网络接口。balance-alb 模式依赖于 swift ARP 欺骗,通过动态重写 MAC 地址来欺骗内核,使其认为两个物理接口是一个。因此,接口的驱动程序必须支持此功能,但许多驱动程序并不支持。
但这并不是绑定驱动程序所能做的全部。模式选项为您提供了七种选择,您不必担心接口兼容性。但是,您需要考虑您的交换机支持什么。balance-rr、balance-xor 和广播模式需要将交换机端口组合在一起。这有各种不同的名称,因此请查找“中继分组”、“以太通道”、“端口聚合”或类似名称。802.3ad 需要交换机支持 802.3ad。
答案3
首先,您可能知道您实际上永远无法达到 2Gb/s。TCP/IP 的开销可能会将您限制在最大值的 90%。
第二,即使您使用 TCP 卸载引擎,第 3 层以上的堆栈也肯定会影响瓶颈所在。换句话说,您如何传输数据?如果我通过 ssh 隧道使用 rsync,我可以使用 10Gb/s NIC 和它们之间的交叉,但速度不会超过几百 Mb/s。
您还能告诉我们有关拓扑的其他信息吗?您说服务器连接到几个交换机,并且远程客户端遍布世界各地。您的 WAN 连接数是否超过 500Mb/s(总计)?
答案4
我们并没有真正解决这个问题。我们所做的就是设置两个服务器,每个接口上绑定一个 IP,然后按照此处的说明强制流量从其进入的端口流出:
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