每个绑定千兆接口上限为 ~500mbps

每个绑定千兆接口上限为 ~500mbps

这个问题已经让我抓狂好几天了!我最近将几台 Linux 服务器上的 eth0/eth1 接口绑定到 bond1,配置如下(所有系统都一样):

DEVICE=bond0
ONBOOT=yes
BONDING_OPTS="miimon=100 mode=4 xmit_hash_policy=layer3+4 
lacp_rate=1" 
TYPE=Bond0
BOOTPROTO=none

DEVICE=eth0
ONBOOT=yes
SLAVE=yes
MASTER=bond0
HOTPLUG=no
TYPE=Ethernet
BOOTPROTO=none

DEVICE=eth1
ONBOOT=yes
SLAVE=yes
MASTER=bond0
HOTPLUG=no
TYPE=Ethernet
BOOTPROTO=none

您可以在此处看到绑定状态:以太网通道绑定驱动程序:v3.6.0(2009 年 9 月 26 日)

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer3+4 (1)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

802.3ad info
LACP rate: fast
Aggregator selection policy (ad_select): stable
Active Aggregator Info:
    Aggregator ID: 3
    Number of ports: 2
    Actor Key: 17
    Partner Key: 686
    Partner Mac Address: d0:67:e5:df:9c:dc

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:25:90:c9:95:74
Aggregator ID: 3
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:25:90:c9:95:75
Aggregator ID: 3
Slave queue ID: 0

Ethtool 输出:

Settings for bond0:
Supported ports: [ ]
Supported link modes:   Not reported
Supported pause frame use: No
Supports auto-negotiation: No
Advertised link modes:  Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Speed: 2000Mb/s
Duplex: Full
Port: Other
PHYAD: 0
Transceiver: internal
Auto-negotiation: off
Link detected: yes

Settings for eth0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Supported pause frame use: Symmetric
    Supports auto-negotiation: Yes
    Advertised link modes:  10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Advertised pause frame use: Symmetric
    Advertised auto-negotiation: Yes
    Speed: 1000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: on
    MDI-X: Unknown
    Supports Wake-on: pumbg
    Wake-on: g
    Current message level: 0x00000007 (7)
                   drv probe link
    Link detected: yes

Settings for eth1:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Supported pause frame use: Symmetric
    Supports auto-negotiation: Yes
    Advertised link modes:  10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Advertised pause frame use: Symmetric
    Advertised auto-negotiation: Yes
    Speed: 1000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: on
    MDI-X: Unknown
    Supports Wake-on: pumbg
    Wake-on: d
    Current message level: 0x00000007 (7)
                   drv probe link
    Link detected: yes

两台服务器都连接到同一个 Dell PCT 7048 交换机,每台服务器的两个端口都添加到自己的动态 LAG 并设置为访问模式。一切看起来都正常,对吧?然而,以下是使用 2 个线程从一台服务器尝试对另一台服务器进行 iperf 测试的结果:

    ------------------------------------------------------------
Client connecting to 172.16.8.183, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 172.16.8.180 port 14773 connected with 172.16.8.183 port     5001
[  3] local 172.16.8.180 port 14772 connected with 172.16.8.183 port     5001
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec   561 MBytes   471 Mbits/sec
[  3]  0.0-10.0 sec   519 MBytes   434 Mbits/sec
[SUM]  0.0-10.0 sec  1.05 GBytes   904 Mbits/sec

显然两个端口都在使用,但速度远未达到 1Gbps - 这是它们在绑定之前各自工作的速度。我尝试了各种不同的绑定模式、xmit 哈希类型、mtu 大小等,但就是无法让各个端口超过 500 Mbits/sec.....这几乎就像 Bond 本身在某个地方被限制在 1G 一样!有人有什么想法吗?

补充 1/19:感谢您的评论和问题,我将尝试在这里回答这些问题,因为我仍然非常有兴趣最大限度地提高这些服务器的性能。首先,我清除了戴尔交换机上的接口计数器,然后让它为生产流量提供服务。以下是组成发送服务器绑定的 2 个接口的计数器:

  Port      InTotalPkts      InUcastPkts      InMcastPkts      
InBcastPkts
--------- ---------------- ---------------- ---------------- --------
--------
Gi1/0/9           63113512         63113440               72                
0

  Port      OutTotalPkts     OutUcastPkts     OutMcastPkts     
OutBcastPkts
--------- ---------------- ---------------- ---------------- --------
--------
Gi1/0/9           55453195         55437966             6075             
9154

  Port      InTotalPkts      InUcastPkts      InMcastPkts      
InBcastPkts
--------- ---------------- ---------------- ---------------- --------
--------
Gi1/0/44          61904622         61904552               48               
22

  Port      OutTotalPkts     OutUcastPkts     OutMcastPkts     
OutBcastPkts
--------- ---------------- ---------------- ---------------- --------
--------
Gi1/0/44          53780693         53747972               48            
32673

看起来流量正在完美地实现负载平衡 - 但是当 rx 和 tx 组合时,带宽图仍然显示每个接口几乎正好是 500mbps:

Gi1/0/9

Gi1/0/44

端口通道 11

我还可以肯定地说,当它服务于生产流量时,它会不断争取更多的带宽,并同时与多台其他服务器进行通信。

编辑 #2 1/19:Zordache,您让我想到,Iperf 测试可能受到接收端仅使用 1 个端口和 1 个接口的限制,因此我同时运行了 server1 的两个实例,并在 server2 和 server3 上运行了“iperf -s”。然后,我同时从 server1 向服务器 2 和 3 运行了 Iperf 测试:

iperf -c 172.16.8.182 -P 2
------------------------------------------------------------
Client connecting to 172.16.8.182, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 172.16.8.225 port 2239 connected with 172.16.8.182 port 
5001
[  3] local 172.16.8.225 port 2238 connected with 172.16.8.182 port 
5001
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec   234 MBytes   196 Mbits/sec
[  3]  0.0-10.0 sec   232 MBytes   195 Mbits/sec
[SUM]  0.0-10.0 sec   466 MBytes   391 Mbits/sec

iperf -c 172.16.8.183 -P 2
------------------------------------------------------------
Client connecting to 172.16.8.183, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  3] local 172.16.8.225 port 5565 connected with 172.16.8.183 port 
5001
[  4] local 172.16.8.225 port 5566 connected with 172.16.8.183 port 
5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   287 MBytes   241 Mbits/sec
[  4]  0.0-10.0 sec   292 MBytes   244 Mbits/sec
[SUM]  0.0-10.0 sec   579 MBytes   484 Mbits/sec

两个 SUM 相加后仍不会超过 1Gbps!至于您的另一个问题,我的端口通道仅使用以下 2 行进行设置:

hashing-mode 7
switchport access vlan 60

哈希模式 7 是戴尔的“增强哈希”。它没有具体说明它的作用,但我尝试了其他 6 种模式的各种组合,它们是:

Hash Algorithm Type
1 - Source MAC, VLAN, EtherType, source module and port Id
2 - Destination MAC, VLAN, EtherType, source module and port Id
3 - Source IP and source TCP/UDP port
4 - Destination IP and destination TCP/UDP port
5 - Source/Destination MAC, VLAN, EtherType, source MODID/port
6 - Source/Destination IP and source/destination TCP/UDP port
7 - Enhanced hashing mode

如果您有任何建议,我很乐意再次尝试其他模式,或更改我的端口通道上的配置。

答案1

在计算机上,您的绑定使用哈希策略Transmit Hash Policy: layer3+4,基本上意味着用于给定连接的接口基于 ip /端口。

您的 iperf 测试是在两个系统之间进行的,并且 iperf 使用单个端口。因此,所有 iperf 流量可能仅限于绑定接口的单个​​成员。

我不确定您看到的内容是什么,让您认为两个接口都在使用,或者每个接口正在处理一半。Iperf 只是报告每个接口的结果线。不是每个接口。查看交换机上的接口计数器会更有趣。

您提到尝试不同的哈希模式。由于您正在连接到交换机,因此您还需要确保更改交换机上的哈希模式。计算机上的配置仅适用于传输的数据包。您还需要在交换机上配置哈希模式(如果您的硬件有此选项)。

在两个系统之间使用绑定时,绑定并没有那么有用。绑定不会为您提供两个接口的全部带宽,它只是让您让一些连接使用一个接口,而一些连接使用另一个接口。有些模式可以在两个系统之间提供一些帮助,但它最多只能带来 25-50% 的改进。您几乎永远无法获得两个接口的全部容量。

答案2

唯一能够提高单个 TCP 连接吞吐量的绑定模式是balance-rr (或模式 0)。这种绑定模式实际上会将传出的数据包“条带化”到 2 个(或更多)可用接口上。但是它也有自己的缺陷:

  • 不能保证数据包的正确排序;
  • 它只会影响传出包裹;
  • 它并不总是安全地与交换机一起工作(可以将其检测为 MAC 中毒/抖动的一种形式);
  • 它不是标准的 LACP 模式。

Linux 内核文档

余额-rr:此模式是唯一允许单个 TCP/IP 连接跨多个接口分条传输流量的模式。因此,它是唯一允许单个 TCP/IP 流利用多个接口的吞吐量的模式。但这是有代价的:分条传输通常会导致对等系统接收无序数据包,从而导致 TCP/IP 的拥塞控制系统启动,通常是通过重新传输段来实现的。

有关如何使用 balance-rr 的实际示例,请阅读这里

回到您的设置:由于您使用的是 802.3ad/模式 4 (LACP),因此您的系统不能使用多个接口进行单个连接。通过打开单个 TCP 或 UDP 流,iperf完全不会从 LACP 中受益。另一方面,多会话感知协议(例如:SMB 3.0+)可以充分利用您的附加接口。

相关内容