
做网络和运维的这几年我差不多把“性能瓶颈”和“线路故障”这两件事都碰到过无数次。最典型的一种场景是两台交换机之间明明插了四五根千兆线结果因为不会配置链路聚合实际带宽永远只走一根或者服务器上明明有四块网卡做业务的同事一直抱怨网速慢一问才知道除了主用链路其它几根压根没用上。这时候“LACP链路聚合”就是绕不开的关键词。它能把多条物理链路捆成一条逻辑链路解决的不只是带宽不够还有单点故障的隐患。这篇内容我不会只给你背命令我更想把这个协议的原理、配置要点和踩坑经验一次性讲透。1. 从单链路之困说起LACP到底解决什么问题1.1 单链路的两大痛点带宽不够断了就断先说带宽。1Gbps的物理端口实际跑业务能到多少因为以太网协议开销和8b/10b编码千兆链路实测峰值也就是110MB/s左右换算成带宽大约880-950Mbps。你在机房做虚拟机迁移、做备份系统、做NFS共享单条千兆很容易打满。这时候有人直接想到万兆方案但问题在于万兆光模块贵交换机端口密度不见得支持网卡也要换线的距离还可能超标。链路聚合相比之下几乎不用换硬件把现有空闲端口用起来逻辑带宽成倍增长它是成本最低的扩容手段之一。再说可靠性。一根物理线缆只要断了对端业务就是硬断。物理链路的特点是平时看着很稳坏的时候特别突然。哪怕你在服务器上插了三块网卡如果这三块网卡各自走独立路径而不做捆绑主链路断了之后业务并不会自动平滑切换而是要等路由协议收敛或者手动处理。而LACP可以把这些链路纳入同一个逻辑接口链路断了之后由备选成员口自动顶替感知速度最快可以做到秒级以内。对业务连续性要求高的场景这个价值比带宽扩翻倍还珍贵。1.2 链路聚合不是简单“拼带宽”它是把小路扩成多车道很多人一听链路聚合第一反应是“两根线合起来等于一根更粗的线”。这里我要纠正一个底层认知聚合后的逻辑链路不是把两条物理链路流量直接合并成一条“宽带水管”而是把网络流量通过哈希算法分发到不同的成员链路上。可以理解成把原本的单车道改成多车道每辆车数据流按照某种规则被分配到某一条车道车道之间有调度规则保证流量分散而不是所有车都挤在一条道上。所以链路聚合的带宽收益严格来说取决于“流的数量”而不是“单条流的大小”。如果你只有一条非常大的数据迁移流比如几十GB的文件拷贝这一条流只会哈希到一条链路上其他链路帮不上忙。反过来如果你是很多并发的小流大量客户端同时访问服务器、大量虚机互访哈希可以把这些流均匀散开叠加收益就很明显。搞清楚这个模型后面遇到“聚合了可还是跑不满”的问题时你才知道问题到底出在哪。1.3 为什么不能直接把几根网线插上去完事这是最容易被新手忽略的部分。把服务器两根网线同时插到交换机上不做任何配置结果往往不是带宽翻倍而是交换机端口直接被STP阻塞一根。因为两台设备之间出现两条可达路径物理层成了环路交换机为了防止广播风暴必须让STP阻断其中一条链路。一根线堵着一根线还被block带宽一点都没发挥出来。那把链路手工捆绑行不行早期的静态链路聚合确实可以不靠协议全靠管理员手工在两端配置相同的成员口。但这种做法有两个隐患一是成员口顺序、速率、VLAN配置只要有一端出错整组链路就废了二是链路断掉之后没有协议去感知和重新计算你需要手动去处理。LACP的存在就是把这些“人肉对齐”和“故障感知”交给协议本身两端每秒钟或几十秒互发协商报文自动确认哪些端口是活动口哪些端口作为备份一旦活动口断掉备份口自动顶上。这就是LACP最核心的价值。2. LACP协议原理与关键参数它怎么做到自动协商2.1 三种聚合模式手工、静态LACP、动态LACP怎么选很多读者第一次看到“聚合模式”会有点晕因为不同厂商的术语还不一样。我做了张对比表看完基本就清楚了配置模式华为命令措辞华三命令措辞是否启用LACP适用场景手工负载分担mode manual load-balance无对应模式华三只有静态/动态否对端不支持LACP或中间经过不支持LACP的传输设备静态LACPmode lacp-static聚合口下 link-aggregation mode static是主动协商主流场景手工创建聚合口协议维护成员状态动态LACP无此独立模式link-aggregation mode dynamic是主动协商对端也支持LACP希望自动选出活动口和备份口注意一个容易踩坑的点华为华三对接时“手工负载分担”只能和“手工负载分担”对接LACP模式只能和LACP模式对接。如果你把华三这边配成dynamic华为那边必须配lacp-static不能拿manual去硬兑否则LACPDU都发不出去聚合组永远起不来。实际项目中选哪种我的习惯是只要对端设备支持LACP一律用LACP模式只有当对端是老旧设备、或者中间链路无法保证LACP报文穿过去的时候才考虑手工负载分担。LACP模式多出来的价值不只是自动协商它还能实时检测链路状态、自动把故障链路剔除出活动组这些能力是纯手工模式给不了的。2.2 LACPDU协商过程拆解两端是怎么“谈拢”的LACP协商过程可以浓缩成四个步骤两端周期性发送LACPDULink Aggregation Control Protocol Data Unit短模式下每1秒发送一次长模式下每30秒发送一次。报文里面携带了设备系统优先级、系统MAC、端口优先级、端口号、端口状态这些关键信息。接收端收到后优先比较系统优先级数值越小优先级越高如果系统优先级相同再比较系统MACMAC越小越优先。这一步是为了选出“哪个设备拥有主导权”。主导设备按端口优先级数值越小越优先排序选出前N个端口作为活动口其余端口设置为Standby备份口。活动链路一旦断开备份口立即接管。这里有一个容易被忽略的设计思路LACP并不是简单地对两端所有端口“平均分配”它有一个明确的优先级仲裁机制。这也是它能做冗余的原因所在。比如你配置聚合组有4根线但业务实际只需要2根带宽另外2根就可以作为热备。当活动口断掉一根系统会在毫秒到秒级的时间内重新计算把Standby口提升为活动口。2.3 短超时还是长超时细节决定业务中断多久LACP报文发送周期和超时时间是可以配置的术语上叫LACP fast短超时和LACP slow长超时。短模式每秒发一次报文3秒没收到对端报文就认为链路失效长模式30秒发一次报文90秒没收到才算失效。切换速度和故障收敛时间直接挂钩。对网络稳定性要求高、希望链路断掉后尽快切换的场景建议两端都配短超时LACP fast。对CPU资源敏感、只要能检测到大故障就行的一般场景用长超时也够用。有个非常坑的细节不同厂商设备的默认超时模式不见得一样对接前一定要用状态查看命令确认。否则可能出现一边默认短超时、一边默认长超时的情况虽然也能协商起来但故障切换的时间会明显拉长。服务器侧的bonding里对应参数叫lacp_rate可以设置fast或slow需要和交换机侧对齐。我踩过最痛的一次是交换机侧设了fast服务器侧没改默认slow结果链路中断之后足足等了90秒才切换业务都打爆了。2.4 负载均衡哈希流量怎么被散到多条链路链路聚合的流量分发在三层设备上一般靠哈希常见哈希维度包括源MAC、目的MAC、源MAC目的MAC组合、源IP、目的IP、源IP目的IP组合部分高端设备还支持基于四层端口号源端口、目的端口的哈希。命令上华为是interface Eth-Trunk1 load-balance src-dst-ip华三是在聚合口或系统视图下link-aggregation load-sharing mode destination-ip source-ip选择什么哈希算法要看你的流量模型。举个实际例子你把链路聚合配置在接入交换机的上行口这个口下面接了100台终端终端对外访问的服务器就那几台。这时候如果按目的MAC哈希所有流的目的MAC基本都指向那几台服务器哈希结果高度集中必然出现一条链路打满、其他链路闲置的情况换成src-dst-mac或者src-dst-ip就能分散得多。还有一个铁律必须记住同一数据流必须始终走同一条物理链路。因为TCP是要保证顺序的如果同一个TCP连接里的报文被分发到不同的物理链路接收端会收到乱序的报文TCP会疯狂重传、窗口直接崩掉。哈希算法的设计目的就是确保“同流同路”你可以把哈希理解成“按流的特征做指纹匹配”同一个流算出同一个结果自然只能走同一条链路。3. 交换机侧配置实例华为eNSP与华三真机3.1 华为eNSP演练Eth-Trunk LACP模式配置华为设备的聚合口叫Eth-TrunkeNSP模拟器里完全可以复现这个实验。我以两台交换机S1、S2之间接两根千兆线为例把两端的配置写出来。第一台S1system-view sysname S1 # 创建Eth-Trunk 1并配置为LACP模式 interface Eth-Trunk1 port link-type trunk port trunk allow-pass vlan 10 20 mode lacp-static load-balance src-dst-mac quit # 将物理口加入Eth-Trunk interface GigabitEthernet0/0/1 eth-trunk 1 quit interface GigabitEthernet0/0/2 eth-trunk 1 quit第二台S2也做对称配置system-view sysname S2 interface Eth-Trunk1 port link-type trunk port trunk allow-pass vlan 10 20 mode lacp-static load-balance src-dst-mac quit interface GigabitEthernet0/0/1 eth-trunk 1 quit interface GigabitEthernet0/0/2 eth-trunk 1 quit配置完成后用下面两条命令验证display eth-trunk 1会看到协议类型是LACP本地活动端口数量、对端系统MAC都会列出来。再用display lacp statistics可以查看LACPDU收发数量如果Received一直为0说明对端没有发LACP报文过来这时候优先查对端配置而不是盯着本端瞎调。这里有个eNSP新手高频踩的坑直接在物理接口下配置了port link-type trunk然后再把它加入eth-trunk系统会直接报错原因是一个物理口不能同时具备独立业务配置和Eth-Trunk成员配置。正确顺序一定是先在Eth-Trunk接口上配置好VLAN、Trunk属性再把物理口干干净净地加进去。成员口的所有业务配置都以聚合口为准。3.2 华三交换机链路聚合配置实例华三的聚合口叫Bridge-Aggregation命令习惯和华为差别挺大。下面是华三常用交换机上配置动态LACP的完整过程system-view # 创建二层聚合接口 interface Bridge-Aggregation 1 port link-type trunk port trunk permit vlan 10 20 link-aggregation mode dynamic quit # 把物理口加入聚合组 interface GigabitEthernet1/0/1 port link-aggregation group 1 quit interface GigabitEthernet1/0/2 port link-aggregation group 1 quit华三里“动态”就是启用LACP的标准做法。验证命令是display link-aggregation verbose输出里会有一个比较关键的信息Selected ports数量和Unselected ports数量。如果两条物理链路都处于Selected状态聚合就成功了如果有一条是Unselected它会告诉你原因——常见的有“The port is in an inactive state”或者速率不一致提示。如果你和华三侧对接时不需要动态特性也可以把聚合口改成link-aggregation mode static这种情况下LACP协议仍然会跑但是聚合组成员关系更多地依赖本地配置。一般来说现代网络里无脑用dynamic就没有问题个别特殊的传输链路或者安全设备串联场景才需要static模式。3.3 配置前必须确认的五个物理前提通过这些年做项目的经验我总结出一张“聚合前的物理基线”检查单每一条都对应过生产故障检查项要求出错后果成员口速率所有成员链路速率一致速率不一致的端口不会被选中聚合组只剩部分链路双工模式必须全部全双工半双工端口协议协商异常甚至引发冲突成员口业务配置保持干净不带独立VLAN/端口安全配置加入时可能直接报错或流量行为异常对端设备必须是同一台设备或同一个堆叠系统跨设备聚合不做堆叠会产生环路线缆连接两端的线缆明确对应同一逻辑聚合组插错成员口会形成环路或校验不一致加成员链路时我还有个习惯不会一次性把所有线全插上而是先加入一根确认聚合口正常协商再一根根加每加一根看一次活动端口数。这样一旦有问题能准确知道是哪根线引发的排查范围很小。如果一次性全插完再配出了广播风暴你都未必能快速定位到是哪根线的问题。4. Linux侧team动态链路聚合配置RHEL 8/CentOS 84.1 为什么服务器侧也需要链路聚合按理说服务器和交换机之间只要交换机侧配好了LACP服务器侧如果不配合也照样跑不起来。因为链路聚合是“双端协议”交换机发送LACPDU的同时服务器得有对应的协议栈去响应。很多做过Windows NIC Teaming、Linux bonding的运维同事都知道这个道理但刚接手Linux服务器的人经常忽略光在交换机上把聚合口建好没用服务器网卡还默认是独立状态两边协商不上。服务器侧链路聚合还有另一个作用在虚拟化平台或容器主机上多块物理网卡捆绑成一个逻辑网卡然后给虚拟交换机使用。这样虚拟机流量能享受多链路带宽物理网卡故障也不会导致宿主机上的所有虚机断网。在数据中心环境里这几乎成了标配。4.2 team和bonding两条技术路线到底怎么选Linux世界实现链路聚合大致有两条路线老牌的bonding内核模块以及后来的team驱动。两者都能跑LACP但设计思路不同。team用了一个用户态守护进程teamd来管理链路配置结构更清晰支持更丰富的runnerlacp、activebackup、loadbalance、roundrobin而bonding更简单直接由内核模块处理配置文件少性能也很稳。问题在于RHEL/CentOS 8开始官方对team的态度是“不推荐使用”RHEL 9中已经逐渐移除。所以在Linux 8里你还能用team但新装系统我更建议直接用bonding。你可以把team理解成一种过渡方案设计初衷想取代bonding的陈旧配置方式但生态和兼容性没有跟上最终官方还是回到bonding并做了改进。对生产环境来说不建议在一个未来可能被移除的机制上长期押注。4.3 RHEL 8/CentOS 8配置team动态链路聚合步骤虽然我建议新环境用bonding但既然很多人还在老系统上用team这里把完整步骤写出来满足“linux8配置team动态链路聚合步骤”这个高频需求。假设服务器有eth0和eth1两块网卡通过nmcli配置# 创建team接口启用LACP runner nmcli connection add type team con-name team0 ifname team0 config {runner:{name:lacp,active:true}} # 添加两个成员口 nmcli connection add type team-slave con-name team0-slave1 ifname eth0 master team0 nmcli connection add type team-slave con-name team0-slave2 ifname eth1 master team0 # 配置IP地址 nmcli connection modify team0 ipv4.addresses 192.168.10.10/24 ipv4.method manual # 启动 nmcli connection up team0 nmcli connection up team0-slave1 nmcli connection up team0-slave2配置完成后查看运行状态teamdctl team0 state view输出里可以关注runner是不是lacp以及ports列表里两个端口是否处于active状态。如果只有一个端口active优先检查交换机的LACP模式其次检查物理链路是否up。team的配置中还支持超时周期参数比如{runner:{name:lacp,active:true,fast_rate:true}}fast_rate为true对应短超时模式能和交换机的LACP fast对齐收敛速度更快。如果你的交换机侧配了短超时这里最好一并设为true。4.4 更推荐的bonding 802.3ad替代方案新环境我推荐用bonding的802.3ad模式配置同样用nmcli命令更简洁# 创建bond接口模式为802.3ad对应LACP nmcli connection add type bond con-name bond0 ifname bond0 mode 802.3ad # 设置监测间隔和哈希策略 nmcli connection modify bond0 bond.options miimon100,xmit_hash_policylayer34 # 添加两个成员口 nmcli connection add type ethernet con-name bond0-slave1 ifname eth0 master bond0 nmcli connection add type ethernet con-name bond0-slave2 ifname eth1 master bond0 # 配置IP nmcli connection modify bond0 ipv4.addresses 192.168.10.10/24 ipv4.method manual # 启动 nmcli connection up bond0 nmcli connection up bond0-slave1 nmcli connection up bond0-slave2验证命令cat /proc/net/bonding/bond0关注两个字段Bonding Mode是否为IEEE 802.3ad Dynamic link aggregation以及MII Status是否都是up。如果交换机侧配了LACP这里能看到对应端口协商成功。miimon100的意思是每100毫秒检测一次链路状态通过网卡是否响应MII来确认链路可用。这个参数配到200也能接受但不要设成0否则链路监测机制形同虚设。xmit_hash_policylayer34是让哈希基于IP和端口比默认的layer2基于MAC对三层流量更均匀。5. 常见问题与排查实录5.1 聚合口协商不起来的排查清单聚合链路最常见问题是“端口都up但聚合组里没有Selected端口”。我按出现频率从高到低列了一张排查表现象可能原因排查命令/动作两端MAC不同但LACPDU收到0条模式不匹配一端手工一端LACP检查两端模式是否同为LACPLACPDU收到但备用口一直是Unselected成员口速率/双工不一致用display eth-trunk 1看端口速率把不一致的端口改一致一侧Selected、一侧全部Unselected两端系统优先级/端口优先级配置冲突检查系统优先级配置启用默认或统一设置线缆插错设备对端不是同一台交换机的聚合组拔掉其他线缆逐根测试聚合口下配置了VLAN物理口有残留配置物理口配置和聚合口配置冲突清理物理口全部配置只保留eth-trunk或port link-aggregation group有一种情况特别容易让人抓狂服务器bonding里你明明看到端口都是up交换机上却显示LACPDU收到了但端口不选。这种大概率是两端超时模式配置不一致导致的。交换机和服务器之间一个用fast一个用slow虽然协商报文能互相收到但定时器判断会出现分歧。解决办法是把两端统一成同一模式命令层面确认后再看状态。5.2 链路都up了但流量总打满一条“状态全是Selected但跑起来还是只有一条链路流量高”——这基本是哈希策略和流量模型不匹配导致的。最常见的就是默认哈希按MAC但你的核心流量集中在少数几个MAC之间。比如后端存储和前端计算节点就那么几台哈希结果全落在一个成员口上。对策有几个按效果优先级排序把负载均衡模式从MAC改为IP或IP端口华为用load-balance src-dst-ip华三用link-aggregation load-sharing mode source-ip destination-ip。如果设备支持L4哈希直接改成四层哈希按源目IP端口做更细粒度分发。查交换机是否支持“增强型负载均衡”或“灵活哈希”特性高级特性往往能按业务流不均匀程度做加权。重新评估业务模型单条业务流本身带宽接近单链路带宽链路聚合帮不了忙。这里再强调一次“同流同路”的原则把哈希策略调细是没问题的但要保证同一五元组或同一MAC对的流始终走同一条链路。否则拆流会造成TCP乱序流量不升反降。我在实际生产上见过一次事故同事把华为负载均衡模式改成了src-dst-ip-port结果虚机迁移大流量被拆到了两条链路上传输速率反而掉了一半。后来查资料才知道那条迁移流的五元组其实完全一样按端口哈希理论上应该还是同一条链路但vSphere的迁移流量用的是多TCP流部分流被拆开才导致乱序。做变更之前先搞清楚业务流的结构远比抄配置更重要。5.3 加了新链路反而出现广播风暴这种情况往往发生在“聚合组成员配置不对称”时。比如你对端A交换机的聚合组只加了两条链路但B交换机那边手滑把第三根线也加进了聚合组结果这根线另一端没有进聚合组的端口配对物理环路形成广播风暴瞬间就起来了。另外一个隐蔽的坑是在堆叠场景里跨框聚合链路如果有一个物理口插错到另一台独立交换机上整组链路会疯狂刷LACPDU并触发环路口。这类故障的典型现象是交换机CPU飙升、端口指示灯疯狂闪、ping延迟突然暴涨。处理办法就是先拔线、再定位拔掉可疑的新增链路观察风暴是否停止确认是某根线导致的后重点检查接口配置是不是干净的、两端到底接没接在同一台逻辑设备上。如果交换机有display loopback-detection这类功能也能辅助定位环路端口。5.4 状态查看与抓包命令速查最后放一张状态检查和抓包命令的速查表方便大家出故障时快速下手场景设备/系统命令华为交换机查看聚合状态华为display eth-trunk 1华为交换机查看LACP统计华为display lacp statistics华三交换机查看聚合明细华三display link-aggregation verbose华三查看LACP统计华三display lacp statisticsLinux team状态RHEL/CentOSteamdctl team0 state viewLinux bonding状态RHEL/CentOScat /proc/net/bonding/bond0抓包查看LACPDULinux抓包tcpdump -i eth0 -nn ether proto 0x8809在交换机上抓LACPDU其实不太方便最直接的做法是在服务器侧抓包。LACPDU的以太网类型是0x8809如果你在服务器上抓LACP报文能精准看到LACP具体协商到哪一步、是对方没发报文还是发了报文没协商成功。这个技巧在“到底是谁的问题”这种两方扯皮的场景下特别管用。6. 写在最后关于LACP的三个认知纠偏做LACP调优这几年踩了无数坑之后我最深的感受是这个技术不是万能的但它把网络带宽和可靠性的导出方式从“拼硬件”变成了“拼调度”。最后分享三个我自己的认知纠偏希望能帮大家少走弯路。第一LACP不能拆开单条大流。但凡有人告诉你“做了链路聚合单线程下载速度会翻倍”那一定是误读。链路聚合改善的是并发流的能力不是单条流的速率。真正想提升单条流速率只能换高带宽链路或者对应用做拆流处理链路聚合帮不上忙。第二配置顺序比想象力重要。先建聚合口、再配全局属性、最后加成员口这是个铁律。成员口一旦进过别的VLAN、配过别的业务再塞进聚合组里很可能带来自诩“神圣不可侵犯”的优先级冲突。所有聚合组成员在加入前应该保持默认状态这句话我每次培训都要重复一遍。第三跨设备聚合一定要先有堆叠。两台核心交换机想共享同一个聚合组前提是它们必须是一个逻辑体系。如果没做堆叠强行把一根线接A交换机、一根线接B交换机做聚合LACP协议本身不会帮你去处理跨设备的MAC表同步环路风险极高。把堆叠做完再做跨设备聚合这才是正经路子。最后再分享一个实用小技巧每次完成LACP配置后别急着宣布完成先打一发长ping然后一根一根拔掉成员链路线缆观察业务是否连续无感切换。这个动作看起来粗暴却是验证链路聚合真实效果的黄金标准。真正经历过几次拔线测试之后你才会对这个协议建立充分的信任感。