环境:超聚变 V7/V8 + Intel E810 25G 双口 + 华为交换机 + ubuntu 22.04
工具:iperf 2.2.1
结果:-P 8 多流实测 47.1 Gbps,达到 2×25G 理论满速


一、背景

之前测 bond1(active-backup)主备切换,顺带把 VLAN 子接口也跑了一遍。这次换 bond4(802.3ad / LACP),目标是验证双口能不能真正叠加带宽。

bond1 的结论很简单:主备模式,带宽不叠加,交换机侧配独立端口就行。但 bond4 完全是另一套逻辑——两端必须协商,交换机必须配 LACP,配错一个环节就聚合不起来。

这篇记录整个过程,重点写踩过的坑,尤其是那个让 VLAN 完全不通的"静态聚合 vs active-backup"冲突。


二、环境与拓扑

服务器 A1                         服务器 A2
bond4 192.168.1.22/24            bond4 192.168.1.11/24
  eno80 ──┐                        ens3f0 ──┐
  eno81 ──┤                        ens3f1 ──┤
          └── 华为交换机 Eth-Trunk ──┘
              25GE1/0/5、6  ← A1
              25GE1/0/7、8  ← A2
项目A1A2
测试口eno80、eno81ens3f0、ens3f1
bond4 IP192.168.1.22/24192.168.1.11/24
交换机口25GE1/0/5、/625GE1/0/7、/8
聚合口Eth-Trunk4Eth-Trunk5

三、先搞清楚 bond4 和 bond1 的区别

这是后面所有坑的根源,先列清楚:

bond1(active-backup)bond4(802.3ad / LACP)
链路使用只有 active 口收发所有成员口同时收发
带宽单口,不叠加多口叠加
交换机侧独立端口,不配聚合必须配 Eth-Trunk + LACP
协商无双向 LACPDU 协商

一句话:bond1 是"冗余",交换机别配聚合;bond4 是"叠加",交换机必须配 LACP。两端语义必须匹配。


四、交换机配置

4.1 创建 Eth-Trunk(LACP)

system-view

interface Eth-Trunk 4
 mode lacp-static
 trunkport 25GE1/0/5
 trunkport 25GE1/0/6
 port link-type access
 port default vlan 1
 quit

interface Eth-Trunk 5
 mode lacp-static
 trunkport 25GE1/0/7
 trunkport 25GE1/0/8
 port link-type access
 port default vlan 1
 quit

commit
quit
save

无 VLAN 子接口场景,Eth-Trunk 配 access + VLAN 1,收发 Untagged 帧,和服务器侧 bond4 直配 IP 匹配。

4.2 负载分担模式(这个后面会踩坑)

先看默认值:

display eth-trunk 4
# Hash Arithmetic: profile default

profile default 是系统默认哈希模板,对 IP 多流不一定友好。建议改成:

interface Eth-Trunk 4
 load-balance src-dst-ip
 quit
interface Eth-Trunk 5
 load-balance src-dst-ip
 quit
commit
save
display eth-trunk 4
# Hash Arithmetic: src-dst-ip

load-balance 是接口级命令,每个 Eth-Trunk 都要单独配,多次执行以最后一次为准。


五、服务器配置(nmcli)

A1

nmcli connection add type bond \
  con-name bond4 ifname bond4 \
  bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4" \
  ipv4.method manual ipv4.addresses 192.168.1.22/24

nmcli connection add type ethernet con-name bond4-slave-eno80 ifname eno80 master bond4
nmcli connection add type ethernet con-name bond4-slave-eno81 ifname eno81 master bond4

nmcli connection up bond4-slave-eno80
nmcli connection up bond4-slave-eno81
nmcli connection up bond4

A2

nmcli connection add type bond \
  con-name bond4 ifname bond4 \
  bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4" \
  ipv4.method manual ipv4.addresses 192.168.1.11/24

nmcli connection add type ethernet con-name bond4-slave-ens3f0 ifname ens3f0 master bond4
nmcli connection add type ethernet con-name bond4-slave-ens3f1 ifname ens3f1 master bond4

nmcli connection up bond4-slave-ens3f0
nmcli connection up bond4-slave-ens3f1
nmcli connection up bond4

关键参数:

参数值说明
mode802.3adLACP 动态聚合
lacp_ratefast每 1 秒发 LACPDU
xmit_hash_policylayer3+4按 IP + 端口哈希

六、验证 LACP 到底协商成功没有

cat /proc/net/bonding/bond4

重点看这几个字段:

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer3+4
LACP rate: fast

Slave Interface: eno80
MII Status: up
Aggregator ID: 1              ← 两个 slave 必须相同
Partner Sys Id: f4:79:60:0b:dd:a1   ← 必须有值

Slave Interface: eno81
MII Status: up
Aggregator ID: 1              ← 与上面相同
Partner Sys Id: f4:79:60:0b:dd:a1

判据:

  • Aggregator ID 两个 slave 一致

  • Partner Sys Id 有值(交换机 MAC),不是全 0

交换机侧对照:

display eth-trunk 4
# 成员口必须是 Selected,不是 Unselect
# Partner SystemID 必须有值

七、测试结果

A1 起服务端,A2 打流:

# A1
iperf -s -p 5001 -w 2M -B 192.168.1.22

# A2
iperf -c 192.168.1.22 -w 2M -P 8 -t 300 -i 5

稳定后连续多个采样点:

[  4] 225.00-230.00 sec  6.85 GBytes  11.8 Gbits/sec
[  2] 225.00-230.00 sec  6.85 GBytes  11.8 Gbits/sec
[  6] 225.00-230.00 sec  3.43 GBytes   5.88 Gbits/sec
[  3] 225.00-230.00 sec  2.28 GBytes   3.92 Gbits/sec
[  8] 225.00-230.00 sec  2.28 GBytes   3.92 Gbits/sec
[  1] 225.00-230.00 sec  2.28 GBytes   3.92 Gbits/sec
[  5] 225.00-230.00 sec  1.71 GBytes   2.94 Gbits/sec
[  7] 225.00-230.00 sec  1.71 GBytes   2.94 Gbits/sec
[SUM] 225.00-230.00 sec  27.4 GBytes  47.1 Gbits/sec

47.1 Gbps,25 秒零抖动。

把流分个组就明白了:

分组流合计对应链路
组 1[4]+[2]11.8×2 = 23.6G物理口 A
组 2其余 6 条5.88 + 3.92×3 + 2.94×2 = 23.5G物理口 B
总计8 条47.1G双口满载

23.5G 正好是 25G 单口的实际线速(扣掉帧开销)。哈希把 8 条流精确分成两组,两个口各自跑满,这就是 2×25G 的理论满速。


八、踩过的坑(重点)

坑 1:Eth-Trunk 静态聚合 vs bond1 active-backup,VLAN 完全不通

这是之前测 bond1 时踩的,但很有代表性。

现象:交换机侧把两个口配成 Eth-Trunk(静态 manual 聚合),Linux 侧是 bond1 active-backup,VLAN 10 完全不通,arping 0 响应。

根因:

  • 静态聚合按哈希把流量分发到所有成员链路;

  • active-backup 只有 active 口收发,standby 口不响应;

  • ARP 广播被哈希到 standby 口后直接丢弃,对端收不到应答。

解决:bond1 场景下交换机不配 Eth-Trunk,两个口作为独立 Trunk 口加入同一 VLAN。

结论:冗余用独立端口,叠加用 LACP,混用必出问题。

坑 2:多流吞吐在 23.6G / 38G / 47.1G 之间跳

同样的 -P 8,三次结果完全不同:

结果现象原因
23.6G8 条流均匀,每条 2.3~3.6G哈希全落到同一个口,单口跑满
38G[8] 独占 15.3G哈希分成 1:2 两组,不均
47.1G两组各 23.5G哈希精确分 2 组,双口满载

根因:LACP 哈希是概率性的。iperf2 的 8 条流源 IP、目的 IP 都一样,只有源端口不同。如果哈希算法对端口不敏感,多条流就可能落到同一个口。

怎么判断是单口还是双口——别看 [SUM],看物理口计数器:

watch -n 1 'cat /sys/class/net/eno80/statistics/tx_bytes; \
            cat /sys/class/net/eno81/statistics/tx_bytes'
  • 两个都在涨 → 双口承载

  • 只有一个涨 → 哈希没分散

优化手段:

  1. 交换机 load-balance src-dst-ip(默认 profile default 换掉)

  2. 增加流数:-P 16、-P 32

  3. 跑多次取最优值,报告里注明哈希概率性

坑 3:ping 通但 iperf 报 No route to host

现象:ping 192.168.1.22 通,iperf -c 192.168.1.22 报 No route to host。

根因:不是链路问题,是 A1 防火墙对 5001 做了 REJECT,返回 ICMP host-unreachable。如果只是没启动 iperf 服务端,报的会是 Connection refused(RST),不是 No route to host。

解决:

firewall-cmd --add-port=5001/tcp --permanent
firewall-cmd --reload

顺便确认服务端在监听:

ss -tlnp | grep :5001

坑 4:TCP window WARNING

TCP window size: 4.00 MByte (WARNING: requested 2.00 MByte)

内核 socket 缓冲区上限不够,请求的 2MB 窗口被压缩。两端都要调:

sysctl -w net.core.wmem_max=4194304
sysctl -w net.core.rmem_max=4194304
sysctl -w net.ipv4.tcp_wmem="4096 87380 4194304"
sysctl -w net.ipv4.tcp_rmem="4096 87380 4194304"

调完重启 iperf 服务端,WARNING 消失。

坑 5:Eth-Trunk 成员口一直是 Unselect

display eth-trunk 2
# 25GE1/0/5  Unselect
# Partner SystemID  0000-0000-0000

根因:服务器侧还是 bond1,没跑 LACP,交换机收不到 LACPDU,Partner SystemID 全 0。

解决:服务器侧改成 mode=802.3ad,交换机侧 mode lacp-static,协商成功后成员口自动变 Selected。


九、完整配置速查

位置配置
交换机 Eth-Trunkmode lacp-static + trunkport + access VLAN 1
交换机负载分担load-balance src-dst-ip
Linux bond4mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4
LACP 验证Aggregator ID 一致 + Partner Sys Id 有值
交换机验证成员口 Selected + Partner SystemID 有值
双口验证两个物理口计数器同时增长
测试命令iperf -c <IP> -w 2M -P 8 -t 300 -i 5

十、总结

  1. bond4 和 bond1 是两套完全不同的语义:bond1 交换机不配聚合,bond4 交换机必须配 LACP。配错一个环节就聚合不起来。

  2. LACP 哈希分布是概率性的:同样的 -P 8 可能跑出 23.6G(单口)、38G(偏斜)、47.1G(满速)。判断是否叠加必须看物理口计数器,不能只看 [SUM]。

  3. load-balance src-dst-ip 值得配:默认 profile default 对 IP 多流不友好,改成 src-dst-ip 和 Linux 的 layer3+4 配合,分布更均匀。

  4. 47.1 Gbps = 2 × 23.5G 理论满速:这个结果证明双口 LACP 聚合完全生效,E810 双口在 bond4 下能跑满线速。

  5. 排障顺序:先看 LACP 协商(Aggregator ID + Partner Sys Id)→ 再看双口计数器 → 最后看防火墙和内核参数。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐