端口聚合 LACP 实战:两条千兆为什么不是两千兆

给服务器加第二根网线,交换机和服务器都做成端口聚合,然后跑个测速——还是 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 交换机,就成了环路,聚合也起不来。

八、排错顺序

  1. 逻辑口起来了吗?display eth-trunk 1 / show etherchannel summary / ip -br link,看逻辑口是 UP 还是 DOWN
  2. 成员口都被选中了吗?被标成 standby 或 independent 的,去比对速率、双工、MTU、允许 VLAN
  3. LACP 对上了吗?服务器侧看 Partner Mac Address 不为零;交换机侧看 partner 状态是不是 Aggregatable
  4. 带宽不够再怀疑哈希。多流测速 + 调整 load-balance 因子,别急着换硬件

九、一句话

端口聚合是「多条流分着走、断一根也不瞎」的技术,不是「一根变两根」的加速器。它把带宽和冗余都做成逻辑链路级别的属性,代价是所有成员口必须严格一致、两端必须一起配、单流上限永远不变。

相关的几篇可以接着看:交换机与路由器的区别(为什么二层聚合不需要路由)、VLAN 实战(聚合口上的 trunk 与 native VLAN)、交换机端口镜像与抓包(聚合口怎么做镜像排错)、服务器变慢先别重启(链路层丢包怎么用命令看出来)。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容