我们采用802.3ad模式绑定的双网卡服务器。
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v5.14.21
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
Peer Notification Delay (ms): 0
802.3ad info
LACP rate: slow
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: 0c:xx:xx:xx:99:40
Active Aggregator Info:
Aggregator ID: 1
Number of ports: 2
Actor Key: 21
Partner Key: 13
Partner Mac Address: 00:xx:5e:00:01:00
Slave Interface: enP1p1s0f0
MII Status: up
Speed: 25000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 0c:xx:xx:xx:99:40
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 0
Partner Churned Count: 0
details actor lacp pdu:
system priority: 65535
system mac address: 0c:xx:xx:xx:99:40
port key: 21
port priority: 255
port number: 1
port state: 61
details partner lacp pdu:
system priority: 65535
system mac address: 00:xx:5e:00:01:00
oper key: 13
port priority: 255
port number: 14
port state: 61
Slave Interface: enP1p1s0f1
MII Status: up
Speed: 25000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 0c:xx:xx:xx:99:41
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 0
Partner Churned Count: 0
details actor lacp pdu:
system priority: 65535
system mac address: 0c:xx:xx:xx:99:40
port key: 21
port priority: 255
port number: 2
port state: 61
details partner lacp pdu:
system priority: 65535
system mac address: 00:xx:5e:00:01:00
oper key: 13
port priority: 255
port number: 32782
port state: 61
两块网卡上的传出数据是平衡的,但是传入的数据集中在一块网卡上。
bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST> mtu 1500
inet xxx.xxx.165.215 netmask 255.255.255.192 broadcast xxx.xxx.165.255
inet6 xxxx::xxx:a1ff:fe5a:9940 prefixlen 64 scopeid 0x20<link>
ether 0c:xx:xx:xx:99:40 txqueuelen 1000 (Ethernet)
RX packets 286959178 bytes 327689609899 (305.1 GiB)
RX errors 0 dropped 24884 overruns 0 frame 0
TX packets 394378427 bytes 477465769012 (444.6 GiB)
TX errors 0 dropped 10 overruns 0 carrier 0 collisions 0
enP1p1s0f0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 0c:xx:xx:xx:99:40 txqueuelen 1000 (Ethernet)
RX packets 7184101080 bytes 9239686504798 (8.4 TiB) <= MOST DATA
RX errors 0 dropped 42969 overruns 0 frame 0
TX packets 4769768089 bytes 6383749337305 (5.8 TiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enP1p1s0f1: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 0c:xx:xx:xx:99:40 txqueuelen 1000 (Ethernet)
RX packets 129986535 bytes 186499719199 (173.6 GiB)
RX errors 0 dropped 1294 overruns 0 frame 0
TX packets 4073423613 bytes 5403193492511 (4.9 TiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我有两个问题:
- 为什么两个网卡上的 RX 数据包不平衡?
- 为什么bond0的各个统计量不等于enP1p1s0f0与enP1p1s0f1的总和?
附加信息: 这台服务器链接到一个堆叠交换机,是否与不平衡有关?
答案1
为什么两个网卡上的 RX 数据包不平衡?
一般来说,它们不是。通过 LACP LAG 为 NIC Rx 端分配流量是交换机的工作。流量分配通常通过从源/目标 IP 地址和端口号的哈希值派生的索引来完成,但实际上没有标准方法 - 请查看手册/配置以了解详细信息。
基于哈希的分布可确保每个流内的数据包顺序不会改变 - 这会比最大化的物理链路对性能的损害更大。
答案2
(这实际上是@Zac67 的回答中一个想法的延续)
LACP 基于哈希的分布设计为,通过理想的哈希和无限数量的流,可以使分布均匀(但想想连接 L3 路由器的两侧基于“L2”的哈希;它们永远只加载一个链接)。其他任何事情都会导致不均匀的分布,并且与理想情况相反,分布会更糟。在单个流的极限下,它将采取一条路径或另一条路径,根本不平衡任何东西。
没有标准,但是有典型的配置:源和目标的 MAC 地址,或IP 和端口。阅读交换机手册,了解它能做什么。例如,如果您发现“L2”平衡(基于 MAC)对您来说很好,请坚持使用它。“L3+4”的行为不太可预测(但“平均而言更均匀”!),因为它取决于随机的端口号。
统计数据永远不会完全匹配。首先,这一切都是动态的,不可能以事务方式开始一切,因此所有统计数据都会同时开始计算。然后,您可以销毁并重新创建您的债券,而无需击落成员,这将重置其统计数据,但不会重置成员中的统计数据——瞧,什么都不匹配。看起来您的系统确实发生了类似的事情。您也可以分离并奴役成员,效果类似。或者您可以重置统计数据。
其次,成员还必须发送和接收 LACP DU,这些 DU 计入成员统计数据中,不会传播到绑定。而且,根据您配置的 LACP 速率,每秒可以发送 DU — 计数。