3、网络瓶颈分析:万兆/25G/100G网络选型、TCP调优与多网卡绑定

备份系统的性能,说白了就是数据从源端到备份存储的搬运速度。我见过太多团队,花大价钱买了全闪存阵列,结果备份速度死活上不去。一查,网络成了瓶颈。嗯,今天我们就来聊聊这个环节。

核心观点:网络是备份管道的直径。管道细了,后端再快也白搭。

3.1 网络选型:万兆、25G 还是 100G?

选网络,不是越贵越好。你得看数据量和备份窗口。我个人习惯先算一笔账:

  • 万兆(10GbE): 理论吞吐 1.25 GB/s。适合单节点备份量在 10TB 以内、窗口 4-8 小时的场景。性价比高,但注意,万兆网卡对 CPU 开销不小。
  • 25GbE: 理论吞吐 3.125 GB/s。这是目前的主流选择。我在项目中遇到过,从万兆升级到 25G,备份时间直接砍半。而且 25G 网卡普遍支持 RoCE(RDMA over Converged Ethernet),对延迟敏感的场景很友好。
  • 100GbE: 理论吞吐 12.5 GB/s。适合超大规模集群,或者备份窗口极短(比如 1 小时内)的场景。但成本高,配套的交换机、光模块、线缆都不便宜。
网络类型 理论带宽 典型场景 单端口成本
10GbE 1.25 GB/s 中小规模、非核心业务 低
25GbE 3.125 GB/s 主流生产环境、中等规模集群 中
100GbE 12.5 GB/s 超大规模、极短备份窗口 高

我的建议: 如果预算允许,直接上 25G。它和万兆的差价在缩小,但性能翻倍。100G 留给核心汇聚层。

3.2 TCP 调优:别让协议栈拖后腿

网络硬件选好了,软件层面不调优,一样跑不满。TCP 协议栈的默认参数,通常是为通用场景设计的,对备份这种大吞吐、长连接的场景,必须动手改。

3.2.1 窗口缩放(TCP Window Scaling)

TCP 窗口大小决定了发送端在等待确认前能发送多少数据。默认窗口只有 64KB,在万兆网络下,一个 RTT(往返时延)就能填满。如果不开启窗口缩放,带宽利用率会惨不忍睹。

我曾经排查过一个案例:备份服务器和存储之间延迟只有 0.5ms,但吞吐死活只有 200MB/s。一查,TCP 窗口最大才 256KB。开启窗口缩放后,直接飙到 900MB/s。

调优方法很简单,修改 /etc/sysctl.conf:

# 开启窗口缩放
net.ipv4.tcp_window_scaling = 1

# 设置最大接收/发送缓冲区(单位:字节)
net.core.rmem_max = 134217728    # 128MB
net.core.wmem_max = 134217728    # 128MB

# 设置 TCP 自动缓冲区调优范围
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

注意: 缓冲区不是越大越好。过大的缓冲区会导致内存占用飙升,甚至触发 OOM。128MB 是一个比较安全的起点,你可以根据实际内存和连接数调整。

3.2.2 Jumbo Frame(巨型帧)

标准以太网帧大小是 1500 字节。Jumbo Frame 允许设置到 9000 字节。你想想看,同样传输 1GB 数据,用 1500 字节的帧,需要拆成约 71 万个包;用 9000 字节,只需要约 11 万个包。包数量少了,CPU 中断次数也少了,吞吐自然就上去了。

启用 Jumbo Frame 需要设备(交换机、网卡、对端)都支持,并且配置一致。我建议在备份网络这个独立的 VLAN 里统一开启。

# 在 Linux 上设置 MTU 为 9000
ip link set dev eth0 mtu 9000

# 验证
ip link show eth0 | grep mtu

避坑指南: 我曾经在一个混合环境中,部分交换机没开 Jumbo Frame,结果导致 TCP 分段重组,性能反而下降。所以,一定要统一。

3.3 多网卡绑定与负载均衡

单网卡总有带宽上限。多网卡绑定(Bonding)是提升吞吐和冗余的常用手段。Linux 支持多种绑定模式,我重点说两种:

  • 模式 0(balance-rr): 轮询模式。数据包依次从每个网卡发出。理论上能聚合带宽,但要求交换机支持静态链路聚合,且对包顺序敏感。不建议用于备份场景,因为乱序会导致 TCP 性能下降。
  • 模式 4(802.3ad): 动态链路聚合(LACP)。这是生产环境的首选。它基于源 MAC、目标 MAC、IP 和端口进行哈希,保证同一 TCP 流的包走同一个网卡,避免乱序。同时支持故障切换。

配置示例(使用 ifcfg-* 文件):

# /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
TYPE=Bond
BONDING_MASTER=yes
BOOTPROTO=static
IPADDR=192.168.100.10
NETMASK=255.255.255.0
BONDING_OPTS="mode=4 miimon=100 lacp_rate=fast xmit_hash_policy=layer3+4"

# /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
MASTER=bond0
SLAVE=yes

# /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
MASTER=bond0
SLAVE=yes

我的经验: 哈希策略选 layer3+4,基于 IP 和端口哈希,比默认的 layer2 更均衡。另外,lacp_rate=fast 让 LACP 每 1 秒发一次协商包,故障切换更快。

3.4 知识体系总览

下面这张图,帮你把网络瓶颈分析的几个关键点串起来:

网络瓶颈分析知识体系 网络瓶颈分析 网络选型 TCP 调优 多网卡绑定 10GbE 25GbE 100GbE 窗口缩放 Jumbo Frame 模式0 (rr) 模式4 (LACP) 核心原则:硬件选型是基础,TCP调优是保障,多网卡绑定是扩展手段,三者缺一不可。

3.5 实战检查清单

最后,给你一份我平时排查网络瓶颈时的检查清单:

  1. 确认网卡速率: ethtool eth0 | grep Speed,看看是不是协商到了预期速率。
  2. 检查 MTU: ping -M do -s 8972 <目标IP>,测试 Jumbo Frame 是否通。
  3. 查看 TCP 缓冲区: sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem,确认窗口缩放已开启。
  4. 验证 Bonding 状态: cat /proc/net/bonding/bond0,看成员网卡是否都 up,LACP 是否协商成功。
  5. 实测吞吐: 用 iperf3 -c <目标IP> -P 4 -t 30 压测,看带宽是否接近理论值。

最后提醒一句: 网络调优是个系统工程。别只调一端,两端都要改。我曾经只调了备份服务器,没调存储端,结果还是跑不满。嗯,这个坑我替你们踩过了。