前言
在服务器双网卡绑定的测试中,bond4 (802.3ad/LACP) 往往是实现带宽叠加的首选。但是,如果你的交换机不支持 LACP,或者由于某种业务限制只能配置静态链路聚合 ,那么 bond2 (Balance-XOR) 就是你实现多口负载均衡的唯一选择。
最近在测试环境中对 25G 双口网卡进行了 bond2 模式的性能与故障切换压测。本文记录了完整的拓扑、配置、实测数据(最高 28Gbps 完美均分)以及跳过的坑,供大家参考。
一、 测试环境与拓扑
为了避免单一客户端源 IP 导致哈希算法无法分散流量,本次测试采用了三机拓扑(双客户端并发,模拟不同源 IP 的流量):
-
Server A (被测服务端) :25G 双口网卡,配置 bond2,IP:
10.0.0.1。 -
Client B (客户端 1) :单口独立网卡,IP:
10.0.0.2。 -
Client C (客户端 2) :单口独立网卡,IP:
10.0.0.3。 -
交换机:二层交换机,采用手工静态聚合。
拓扑连线:

-
Server A 的双口(eth0, eth1)分别接交换机的
1口、2口,配置为 Eth-Trunk 1(静态聚合)。 -
Client B 接交换机的
3口,Client C 接交换机的4口。
二、 核心配置
1. 交换机配置 (以华为/H3C风格为例)
注意:bond2 对端交换机绝对不能配 LACP,必须配手工静态聚合。
system-view
# 创建 Server A 的静态聚合组 (1、2口)
interface Eth-Trunk 1
mode manual load-balance
trunkport 1/0/1 to 1/0/2
port link-type access
port default vlan 1
load-balance src-dst-ip # 建议配置基于IP的哈希
quit
# 客户端独立接口 (3、4口)
interface 1/0/3
port link-type access
port default vlan 1
quit
interface 1/0/4
port link-type access
port default vlan 1
quit
2. 服务端 A (Linux) 配置
使用 nmcli 创建 bond2,并务必指定 layer3+4 的哈希策略(默认的 layer2 极难均分流量)。
# 清理旧配置(如有)
nmcli connection delete bond4 2>/dev/null
# 创建 bond2
nmcli connection add type bond con-name bond2 ifname bond2 \
bond.options "mode=balance-xor,miimon=100,xmit_hash_policy=layer3+4" \
ipv4.method manual ipv4.addresses 10.0.0.1/24
# 添加网卡
nmcli connection add type ethernet con-name bond2-slave-eth0 ifname eth0 master bond2
nmcli connection add type ethernet con-name bond2-slave-eth1 ifname eth1 master bond2
# 启动
nmcli connection up bond2-slave-eth0
nmcli connection up bond2-slave-eth1
nmcli connection up bond2
# 调优内核参数消除 TCP Warning
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 发送 -P 1 单流,并在服务端运行 sar -n DEV 1 观察网卡吞吐:
1. 初始均衡状态
03:33:58 PM IFACE rxpck/s txpck/s rxkB/s txkB/s ... %ifutil
03:33:58 PM eno80 1206400.00 53862.00 1783680.31 ... 58.45
03:33:58 PM eno81 1206400.00 53862.00 1783681.25 ... 58.45
03:33:58 PM bond2 2412800.00 53862.00 3567361.56 ... 58.45
分析 :eno80 和 eno81 的流量完美 1:1 对等,各承载约 14.2 Gbps ,bond2 总带宽达到 28.4 Gbps。哈希算法完美地把两台客户端的流量分开了。
2. 模拟链路 A(eno81)故障
保持打流,物理拔掉 Server A 的 eno81 光模块:
03:34:45 PM IFACE rxpck/s txpck/s rxkB/s txkB/s ... %ifutil
03:34:45 PM eno80 0.00 0.00 0.00 ... 0.00
03:34:45 PM eno81 2031660.00 60427.00 3003833.14 ... 98.43
03:34:45 PM bond2 2031612.00 60425.00 3003762.17 ... 98.43
分析 :eno81 归零,eno80 瞬间飙升,单口扛下所有流量,利用率达到 98.43%(约 24 Gbps 实际线速)。业务在断线 1 秒内极速恢复,无彻底中断。
bash
sar -n DEV 1

3. 链路修复,恢复均衡
插回 eno81 光纤,观察状态:
03:35:28 PM IFACE rxpck/s txpck/s rxkB/s txkB/s ... %ifutil
03:35:28 PM eno80 1192448.00 53231.00 1763053.00 ... 57.77
03:35:28 PM eno81 1192448.00 53231.00 1763053.00 ... 57.77
03:35:28 PM bond2 2384960.00 53227.00 3526200.62 ... 57.77
分析:系统自动自愈,流量再次均分,各占一半。

四、 避坑指南(重要)
本次测试中间遇到过一个非常折腾的"坑",记录一下:
现象 :客户端配置好 IP 后,互相 ping 报 Destination Host Unreachable(目标不可达)。
排查 :检查网卡状态、bond2 绑定状态均正常,底层接口 UP。
根因 :在交换机上执行 display interface 1/0/3 发现,客户端接入的端口 PVID = 10(VLAN 10),而服务端的聚合组 Trunk 1 放行的是 VLAN 1。客户端的 ARP 请求包进交换机后被打上 VLAN 10 标签,到了 Trunk 1 被直接丢弃,导致服务端收不到包。
解决 :统一交换机的 VLAN 划分。执行 port default vlan 1 将客户端接口的 PVID 改回 1,网络瞬间恢复。
五、 测试总结
-
带宽叠加 :得益于
layer3+4哈希策略和多客户端源 IP,bond2 在静态聚合下成功实现了 28.4 Gbps 的双向负载均衡,总吞吐甚至逼近了双 25G 的线速极限。 -
故障切换:具备与 LACP 相当的高可用性。物理断线后,流量能瞬间压向单口(高达 24 Gbps),业务短暂掉速后快速自愈。
-
适用场景 :如果你的交换机无法配置 LACP,bond2 + 静态聚合是非常可靠的替代方案。但切记两点:服务端必须指定
xmit_hash_policy=layer3+4,且交换机侧必须保证 VLAN 配置的一致性。