给服务器加第二根网线,交换机和服务器都做成端口聚合,然后跑个测速——还是 940 Mbps,一点没涨。这时候很多人会怀疑配置没生效,回去反复检查,其实配置全对。
问题出在对「聚合」的理解上:端口聚合(Link Aggregation,华为叫 Eth-Trunk、Cisco 叫 EtherChannel、Linux 叫 bond/teaming)提升的是多条流的总吞吐和冗余,不是单条连接的速度。这个区别不搞清楚,配得再对也会觉得自己配错了。
一、聚合到底解决两个什么问题
1)带宽。两条千兆绑一起,理论上双向总吞吐能到 2 Gbps——前提是流量足够分散,后面第三节解释为什么「前提」这么重要。
2)冗余。这条往往比带宽更实用。一根线拔了、一个光模块坏了、一块板卡掉电,业务不中断。没有聚合的时候,服务器只有一根网线,那根线一断就是整机失联,要等人到机房。
顺带解决一个坑:防止自己接出环路。两个口分别接线又没做聚合,交换机会认为是两条独立的链路,生成树把它其中一个口阻塞,你以为在用两根线,其实只有一根在通。做成聚合以后,交换机把这几个口当成一条逻辑链路,不会再被 STP 拆开。
二、两种模式:手工聚合与 LACP
| 方式 | 华为 | Cisco | 特点 |
|---|---|---|---|
| 手工/静态聚合 | mode manual load-balance |
mode on |
两端都配死,不协商。一端线断了另一端不知道,可能造成流量黑洞 |
| 动态聚合(LACP) | mode lacp-static |
mode active / passive |
靠 LACPDU 协商,能发现对端成员口失效,推荐 |
差别在哪:手工聚合是「我认为这两个口连的是同一个对端」,全靠配置对齐。对端有一个口坏了没起来,你这边依然会把流量哈希到那个口上,包发出去没人接——形成静默丢包,最难查。LACP 会持续用报文确认对端每个成员口的存活,失效的口会被踢出转发组,流量自动重分布。
所以只要对端支持,一律用 LACP。
三、关键:两条千兆为什么不是两千兆
聚合的负载均衡是按流哈希(hash),不是按包轮询。交换机会对每个包算一个哈希值,把同一个值映射到同一个成员口,保证同一个会话的包不乱序。
哈希因子通常是二层的 MAC 组合,或者三层四层的 源IP+目的IP+源端口+目的端口 组合。这意味着:
192.168.1.10:54321 → 192.168.1.20:443这一条 TCP 流,四元组固定,哈希值固定,永远只走一个成员口,上限就是单口 1 Gbps- 同一对 IP 之间开四条不同端口的连接,可能被分到四个口,合计才接近 2 Gbps
- 浏览器同时开十几个连接,你的日常体验确实会变快,但这不代表「单条下载变快了」
所以测速方法必须改。单线程 iperf3 -c 目标 -P 1 只会得到 940 Mbps,正确做法是多流:
iperf3 -c 192.168.1.10 -P 8 -t 30
八个并发流,哈希才有机会摊到不同成员口上。如果你用单线程测出「聚合没效果」,那是最常见的误判——先换 -P 8 再下结论。
还有一条很少有人提:哈希不一定均匀。两个口的情况下,八个流全撞到一个口完全可能,尤其是源目 IP 相同、只有端口不同的场景。所以两条千兆的实际收益经常是 1.2~1.6 Gbps,而不是 2 Gbps。想要真的 2 Gbps 单流,得靠万兆网卡或者多路径,不是聚合。
四、LACP 的工作细节
LACP(IEEE 802.3ad,后来并入 802.1AX)用一种叫 LACPDU 的慢协议报文协商:
- 以太网类型
0x8809,目的 MAC 固定01:80:C2:00:00:02,所以是二层链路本地报文,不过交换机、不影响业务 - 周期 30 秒(slow)或 1 秒(fast / Cisco 叫
lacp rate fast)。排查收敛慢的时候可以临时调快 - 双方的 系统 ID(系统优先级 + 系统 MAC)必须有明确的主次,端口优先级相同时优先级小的一方为主,主导选路
- 成员口要能聚合成一组,条件是速率、双工、MTU、允许的 VLAN 全部一致,任一项不一致就不参与聚合
LACP 有三个角色状态值得记住:
| 状态 | 含义 | 排错用途 |
|---|---|---|
| Selected | 被选中作为活动成员口 | 没被选中 = 速率/MTU/VLAN 与其它口不一致 |
| Standby | 热备成员口(配了最大活动链路数时才有) | 备用口不转发,链路故障才顶上 |
| Collecting / Distributing | 开始收 / 开始发业务流量 | 都 true 才算真正通了;只有一半说明对端没配好 |
模式搭配必须记住这张表,配错是「连不通」最常见的原因:
| 本端 | 对端 | 结果 |
|---|---|---|
| LACP active | LACP active | 通(两端都主动,最快) |
| LACP active | LACP passive | 通(被动端只应答) |
| LACP passive | LACP passive | 不通,谁都不发第一个报文 |
| 手工 on / static | 手工 on / static | 通,但没有协议保护 |
| 手工 on | LACP active | 不通,或者变成单口可用、整组异常 |
五、配置:华为 / Cisco / Linux 服务器
华为(VRP)——两端都是华为时:
interface Eth-Trunk 1
mode lacp-static
max active-linknumber 2
load-balance src-dst-ip
quit
interface GigabitEthernet0/0/1
eth-trunk 1
quit
interface GigabitEthernet0/0/2
eth-trunk 1
quit
display eth-trunk 1
load-balance 默认多为 src-dst-mac,接到服务器的场景建议改成 src-dst-ip,因为服务器侧往往是同网关同 MAC、IP 不同。
Cisco(IOS):
interface range GigabitEthernet0/1 - 2
channel-group 1 mode active
no shutdown
exit
interface Port-channel 1
switchport mode trunk
exit
show etherchannel 1 summary
输出的 SU 表示二层、已聚合在用,P 表示 member 已并入。看到 I(independent)就说明那根线是单干的。
Linux 服务器(bonding,mode 4 = LACP):
# /etc/systemd/network/25-bond0.netdev
[NetDev]
Name=bond0
Kind=bond
[Bond]
Mode=802.3ad
MIIMonitorSec=100ms
LACPTransmitRate=fast
TransmitHashPolicy=layer3+4
# /etc/systemd/network/25-bond0.network
[Match]
Name=bond0
[Network]
DHCP=yes
两块物理网卡各自在 .network 里写 Bond=bond0。TransmitHashPolicy=layer3+4 是关键——默认是 layer2,只按 MAC 哈希,同一对主机之间多流全撞一个口。
验证:
cat /proc/net/bonding/bond0
重点看三行:MII Status: up、Aggregator ID(两个成员口应一致)、Partner Mac Address(不是全零才算协商成功)。伙伴 MAC 全是 00:00:00:00:00:00 就是 LACP 没对上,此时多半在单口工作。
六、七个真实的坑
| 症状 | 原因 | 处理 |
|---|---|---|
| 配完带宽没变化 | 单线程测速,单流只走一个成员口 | 用 iperf3 -P 8 多流测;理解哈希按流 |
| 整组不通 / 只有一个口在工作 | 两端模式不匹配(on 对 active) | 按第四节的搭配表改,两端都用 LACP |
| 带宽只到 1 Gbps 出头 | 哈希不均,或者成员口跨板卡/跨堆叠成员 | 调 load-balance 因子;成员口放在同一芯片组 |
| 小包通、大包丢 | 成员口 MTU 不一致(常见于中间串了防火墙/交换机) | 两端所有成员口和逻辑口统一 MTU,含 TCP MSS 钳制 |
| 配了聚合还是广播风暴/环路 | 两端都做成聚合,但中间还有一根线没进组 | 聚合组的口必须一次全进,别留单根 |
| 一根线断开后业务抖动几秒 | 哈希重算,长连接被重新映射到其它成员口 | 正常现象;用 LACP fast(1 秒)缩短收敛 |
| 虚拟化环境里虚机之间不叠加 | 超融合/虚拟交换机默认单口哈希,或者 LACP 配置只在物理口 | 在虚拟交换层做聚合,或改用多路径 |
补两条容易被当成「配置问题」其实不是的:
- PCIe 和 CPU 会成为真瓶颈。四口千兆卡插在 x4 槽上、或服务器只有一个核处理软中断(
top里si那一列打满),聚合到 4 Gbps 也上不去。用ethtool -S看丢包,用 RPS/RSS 分散中断。 - 单流速度上限不变这件事,不因为换成万兆聚合而改变。两根万兆聚合,单流还是 10 Gbps。要更快就用 RDMA、多路径(MPTCP/多队列),或者干脆上 25G/100G 单口。
七、什么时候该聚合,什么时候别折腾
该聚合:服务器与接入交换机之间(多虚机、多用户并发)、核心与汇聚之间、需要不断网的场景(冗余)。
别指望聚合:单台机器单线程传大文件、备份窗口里只有一条 rsync 流、视频转码单流读盘。这些场景该做的是提高单口速率或并行化应用连接。
跨设备聚合要额外条件:两台交换机之间必须能协同(堆叠、Cisco vPC/VSS、华为 M-LAG、H3C IRF),否则一个口接 A 交换机、一个口接 B 交换机,就成了环路,聚合也起不来。
八、排错顺序
- 逻辑口起来了吗?
display eth-trunk 1/show etherchannel summary/ip -br link,看逻辑口是 UP 还是 DOWN - 成员口都被选中了吗?被标成 standby 或 independent 的,去比对速率、双工、MTU、允许 VLAN
- LACP 对上了吗?服务器侧看
Partner Mac Address不为零;交换机侧看 partner 状态是不是Aggregatable - 带宽不够再怀疑哈希。多流测速 + 调整
load-balance因子,别急着换硬件
九、一句话
端口聚合是「多条流分着走、断一根也不瞎」的技术,不是「一根变两根」的加速器。它把带宽和冗余都做成逻辑链路级别的属性,代价是所有成员口必须严格一致、两端必须一起配、单流上限永远不变。
相关的几篇可以接着看:交换机与路由器的区别(为什么二层聚合不需要路由)、VLAN 实战(聚合口上的 trunk 与 native VLAN)、交换机端口镜像与抓包(聚合口怎么做镜像排错)、服务器变慢先别重启(链路层丢包怎么用命令看出来)。









暂无评论内容