25G 双口网卡 bond4(LACP)实测跑满 47.1Gbps
环境:超聚变 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
| 项目 | A1 | A2 |
|---|---|---|
| 测试口 | eno80、eno81 | ens3f0、ens3f1 |
| bond4 IP | 192.168.1.22/24 | 192.168.1.11/24 |
| 交换机口 | 25GE1/0/5、/6 | 25GE1/0/7、/8 |
| 聚合口 | Eth-Trunk4 | Eth-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
关键参数:
| 参数 | 值 | 说明 |
|---|---|---|
mode | 802.3ad | LACP 动态聚合 |
lacp_rate | fast | 每 1 秒发 LACPDU |
xmit_hash_policy | layer3+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.6G | 8 条流均匀,每条 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'
-
两个都在涨 → 双口承载
-
只有一个涨 → 哈希没分散
优化手段:
-
交换机
load-balance src-dst-ip(默认profile default换掉) -
增加流数:
-P 16、-P 32 -
跑多次取最优值,报告里注明哈希概率性
坑 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-Trunk | mode lacp-static + trunkport + access VLAN 1 |
| 交换机负载分担 | load-balance src-dst-ip |
| Linux bond4 | mode=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 |
十、总结
-
bond4 和 bond1 是两套完全不同的语义:bond1 交换机不配聚合,bond4 交换机必须配 LACP。配错一个环节就聚合不起来。
-
LACP 哈希分布是概率性的:同样的
-P 8可能跑出 23.6G(单口)、38G(偏斜)、47.1G(满速)。判断是否叠加必须看物理口计数器,不能只看[SUM]。 -
load-balance src-dst-ip值得配:默认profile default对 IP 多流不友好,改成src-dst-ip和 Linux 的layer3+4配合,分布更均匀。 -
47.1 Gbps = 2 × 23.5G 理论满速:这个结果证明双口 LACP 聚合完全生效,E810 双口在 bond4 下能跑满线速。
-
排障顺序:先看 LACP 协商(Aggregator ID + Partner Sys Id)→ 再看双口计数器 → 最后看防火墙和内核参数。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)