上面那台 ZFS 存储有两个 25G 口,单口的带宽在大批量镜像拉取时很快就见顶了。我们想把两个口聚合起来,对交换机表现为一条逻辑链路,既提升总吞吐,也在单口或单根线故障时自动切换。FreeBSD 里干这件事的内核模块叫 lagg(别的平台里它叫 bonding、aggregate、port-channel、port-group,名字一堆,是一回事)。
这篇记录我们和华为交换机对接 LACP 的完整配置,以及一个容易让人误会的点:聚合两个 25G 口,不等于单条连接能跑到 50G。
环境
os: FreeBSD 12.3-RELEASE
网卡: Mellanox Technologies ConnectX-4 Lx
交换机: 华为 ce6820-48S6CQ-B
需求很直接:FreeBSD 通过 ConnectX-4 的两个端口连到交换机,配置链路聚合,让两个端口做负载均衡。
FreeBSD 侧配置
先手动跑通,确认链路起得来,再写进配置文件持久化。
kldload if_lagg # 加载 lagg 内核模块(即别处所说的 bonding)
ifconfig lagg0 create # 创建 lagg 接口
ifconfig mce0 up # 启动 mce0 物理口
ifconfig mce1 up # 启动 mce1 物理口
ifconfig lagg0 up laggproto lacp laggport mce0 laggport mce1 # 起聚合口,协议用 lacp
laggproto 除了 lacp,还有 loadbalance、fec、failover、roundrobin、none 可选,下面会说各自的区别。和华为交换机对接,用 lacp。
交换机侧配置
华为侧把对应端口加入 Eth-Trunk 并设为 LACP 动态模式,两侧协议要一致,否则 LACP 协商不起来:
int eth 111
mode lacp-dynamic
持久化到 /etc/rc.conf
手动验证没问题后,写进 /etc/rc.conf,重启也能自动拉起:
ifconfig_mce0="up"
ifconfig_mce1="up"
cloned_interfaces="lagg0"
ifconfig_lagg0="up laggproto lacp laggport mce0 laggport mce1"
ipv4_addrs_lagg0="x.x.x.x/x"
defaultrouter="x.x.x.x"
注意 IP 配在 lagg0 上,不要配在物理口上——物理口只负责出力,三层地址属于聚合接口。
关于 LACP 分流,先把期望摆正
最容易踩的误区,是以为聚合两个 25G 口,一条下载就能跑 50G。不会的。
LACP 按报文头的 hash 决定每一个“流”从哪个成员口出去。FreeBSD 的 lagg hash 用的是以太网源/目的地址、VLAN 标记(如果有),以及 IPv4/IPv6 源/目的地址。同一条连接的源目地址固定,hash 结果就固定,于是这条连接永远只走其中一个口——单条 TCP 连接的上限还是 25G。聚合带来的收益是“多条流之间”的负载均衡:很多客户端同时拉镜像时,这些连接会被 hash 散到两个口上,总吞吐接近 50G。
所以聚合解决的是并发聚合带宽和冗余,不是把单流加速。如果你的瓶颈是单条大流,LACP 帮不上忙,得往别的方向想(多连接、多路径、或更快的单口)。这也是为什么我们在存储那头开了 SMB3 的 multi channel——让单个客户端自己拆成多条流,才吃得到聚合的带宽。
lagg 支持的几种协议
laggproto 能选的模式,以及我们为什么在这个场景选 LACP:
| 协议 | 说明 |
|---|---|
| failover | 主备模式。第一个端口为主,其余为备。流量默认走主口,主口故障后切到备口。只要冗余、不要带宽叠加时用它。 |
| LACP | 支持 IEEE 802.3ad 链路聚合控制协议和标记协议。会与对端协商一个或多个链路聚合组(LAG),每个 LAG 由相同速率、全双工的端口组成,流量在速率总和最大的 LAG 内的端口间均衡;多数情况下只有一个 LAG 包含所有端口。物理连接变化时会快速收敛到新配置。按报文头 hash(以太网源/目的地址、VLAN 标记、IPv4/IPv6 源/目的地址)平衡出向流量,并接受来自任意活动端口的入向流量。对接华为交换机一般用它。 |
| FEC | 支持思科 EtherChannel。静态设置,不与对端协商、也不交换帧来监控链路。如果交换机支持 LACP,就该用 LACP 而不是它。同样按报文头 hash 分流。 |
| loadbalance | FEC 的别名。 |
| roundrobin | 轮询分发,把出向流量平均分到所有活动口,接受来自任意活动口的入向流量。这会打乱以太网帧的顺序,应谨慎使用,且大概率负载并不均衡。 |
| none | 什么都不做:在不禁用 lagg 接口本身的前提下,禁用任何流量。 |
我们选 LACP 的理由是它会和交换机双向协商、能探测成员口故障并快速收敛,这是 FEC/loadbalance 这类静态聚合给不了的。roundrobin 虽然理论上能让单流用上两个口,但它会乱序,对 TCP 是灾难,所以不碰。
落地结论
配置本身十几行就够,真正要记住的是那条分流规则:LACP 聚合提升的是总吞吐和可用性,不是单条连接的速度。配完之后务必用多客户端并发去验证带宽是否真的散到了两个口上——netstat -I 或 systat -ifstat 能直接看到每个物理口的实时流量,别只看聚合口的总数就下结论。
