香港服务器网卡从 10G 升级到 25G/100G 的实战指南:主板/插槽/线缆兼容性、BIOS/固件、驱动与内核优化、交换机 FEC 与速率配置、CentOS 7 全流程调优

凌晨三点,香港荃湾那个冷得发抖的机房里,我抱着两块新到的网卡——一块是 Mellanox ConnectX-4 Lx(25G SFP28),一块是 ConnectX-5(100G QSFP28),背包里塞着几条 SFP28 DAC/AOC、两只 QSFP28 SR4 模块和一捆 OM4 光纤。客户催着说白天要把两台数据库节点的复制窗口缩到 1/3,日志飙到 10G 已经顶不住了,必须上 25G;而边缘缓存那台要直接拉到 100G,打穿机房内网跨机架复制。
我以为只是“插卡、上线、改 MTU、跑 iperf3”的常规活。真正下手才知道,升级链路的“短板”不是网卡本身,而是主板供电/PCIe 通道、插槽电气规格、散热风道、线缆与光模块、交换机侧的 FEC/速率策略——任何一个环节没对齐,带宽上不去,抖动还会放大。下面是那一夜我踩过的坑与逐一解决的全过程。
现场硬件与目标
- 服务器 A(数据库):Supermicro 1029U(双路 Skylake,PCIe 3.0),原卡 Intel X710-DA2(10G SFP+) → 目标卡 Mellanox ConnectX-4 Lx(25G SFP28,双口)。
- 服务器 B(边缘缓存):Dell R740xd(双路 Skylake,PCIe 3.0,x16 插槽两个),原卡 Intel X520(10G) → 目标卡 Mellanox ConnectX-5(100G QSFP28,单口)。
- 机柜交换机:支持 10G/25G SFP28、100G QSFP28,上联骨干 100G。需要注意 FEC(RS/BASE-R) 与 breakout(4×25G) 配置。
- 操作系统:CentOS 7(3.10 内核),需要根据网卡型号选择驱动/内核版本或供应商 DKMS。
一、主板与 PCIe 插槽:瓶颈常常不在网卡
1.1 插槽电气与代际
- 25G 卡(如 CX4 Lx、XXV710)通常在 PCIe 3.0 x8 就能跑满。
- 100G 卡(如 CX5 100G)常见有 PCIe 3.0 x16 或 PCIe 4.0 x8 版本;在仅支持 PCIe 3.0 的平台上,务必插在 x16 电气插槽。
- 早期主板的“物理 x16 实际 x4/x8 走线”很常见,务必查 主板手册的插槽走线表。
1.2 BIOS 相关设置
- 关闭 PCIe ASPM(省电会影响时延抖动)。
- 打开 SR-IOV(如果需要虚拟化/容器直通)。
- 禁用对该插槽的 Auto bifurcation(避免把 x16 拆成 4×x4 影响带宽)。
- 把插槽 Max Link Speed 固定到平台能提供的最高(通常 Gen3)。
1.3 服务器与插槽推荐映射
| 服务器型号 | CPU/芯片组 | 推荐插槽 | 电气规格 | 建议网卡 | 备注 |
|---|---|---|---|---|---|
| Supermicro 1029U | Xeon Scalable(PCIe 3.0) | Slot 5/6 | x8/x16 | 25G:CX4 Lx / XXV710 | 插槽靠近 CPU 的优先 |
| Dell R740xd | Xeon Scalable(PCIe 3.0) | Riser 1 x16 | x16 | 100G:CX5 100G | 避免和 HBA/RAID 抢同一 CPU 的 PCIe 通道 |
| 旧款 R730xd | Xeon v3/v4(PCIe 3.0) | Riser x16 | x16 | 25G/100G 视网卡版本 | 注意背板风道,100G 发热更大 |
现场经验:100G 卡插到“看起来 x16”但实际 x8 的槽位,iperf3 只能到 60~70 Gbps,CPU 核满、丢包抖动明显。把卡挪到真正的 x16 电气槽,立刻上到 90+Gbps。
二、线缆与光模块:SFP28/QSFP28 不是“能插上就能跑”
2.1 规格要点
- 10G 用 SFP+;25G 用 SFP28;100G 用 QSFP28。
- SFP28 口通常可兼容 SFP+ 模块(会降到 10G),反过来不行。
- DAC(直连铜缆):短距离(≤3m)低时延、便宜,但 25G/100G 对铜缆质量和长度更敏感。
- AOC(有源光缆):中距离、省心,但价格更高。
- SR/LR 光模块+光纤:距离长、灵活,注意 多模 OM3/OM4 与 单模 匹配;100G SR4 是 8 芯(4 发送 4 接收)。
- Breakout:QSFP28 100G ↔ 4×SFP28 25G 需要交换机与网卡两端都支持。
2.2 FEC(前向纠错)
- 25G 铜缆/部分光模块常需要 BASE-R FEC 或 RS-FEC 以稳定链路;不同厂商默认值不同。
- 100G 常见 RS-FEC。两端 FEC 必须一致,否则会“Up/Down 抖动”。
2.3 线材选择建议
| 场景 | 建议线材 | 备注 |
| 机柜内 25G 服务器到 Top-of-Rack(≤3m) | SFP28 DAC | 需确认 DAC 是否标注 25G、是否需要 FEC |
| 相邻机柜 25G(3~30m) | SFP28 AOC 或 SFP28 SR + OM3/OM4 | AOC 简化部署,SR 灵活 |
| 机柜内 100G(≤3m) | QSFP28 DAC | 注意弯折半径与理线 |
| 机柜间 100G(≤100m) | QSFP28 SR4 + OM4 | 需要 MPO/MTP 跳线,注意极性 |
| 远距离 100G(>100m~10km) | QSFP28 CWDM4/LR4 + 单模 | 成本高,注意模块兼容性 |
现场经验:一次 25G 链路“忽上忽下”,最后发现是SFP28 DAC 线标注需要 RS-FEC,而交换机默认是 BASE-R,改成 RS-FEC 当场稳定。
三、交换机侧(以通用 CLI 思路示意)
不同厂商命令不同(Arista/Cisco/Rui…),以下为“意图级”配置思路。
25G 口直连(SFP28):
interface Ethernet1/5
description srv-a-ens2f0
speed forced 25gfull
fec rs # 或 base-r,需两端一致
mtu 9216
flowcontrol receive on # 视场景决定是否开 PFC/PAUSE
no shutdown
100G 口直连(QSFP28):
interface Ethernet1/1
description srv-b-ens3f0
speed forced 100gfull
fec rs
mtu 9216
no shutdown
100G → 4×25G Breakout:
interface Ethernet1/2
breakout 4x25g # 把一个 100G QSFP28 拆成四个逻辑 25G 口
!
interface Ethernet1/2/1
description srv-a-ens2f0
speed forced 25gfull
fec base-r
mtu 9216
no shutdown
现场经验:部分交换机 auto-neg 与强制速率/强制 FEC 并存 时,会出现“看起来 Up,吞吐上不去”的情况。干脆统一强制速率+强制 FEC,更可控。
四、固件与驱动:CentOS 7 的现实与取舍
CentOS 7 默认内核 3.10 对新卡(尤其 100G)驱动较老。我的做法是:
优先升级固件:
- Mellanox:
mstflint -d <pci> q查看;必要时mlxup或mstflint -d <pci> burn <fw.bin>。 - Intel:
nvmupdate64e套件按提示升级。
驱动策略:
- Mellanox CX4/CX5:内核自带
mlx5_core可以先试;若功能受限,考虑 MLNX OFED(注意内核版本对应)。 - Intel XXV710(25G):
i40e驱动。 - Intel E810(100G):
ice驱动,CentOS 7 需较新内核或使用厂商 DKMS。 - Broadcom NetXtreme-E(25G/100G):
bnxt_en。
必要时升级内核:通过 ELRepo 安装 kernel-lt(5.4 LTS)或 kernel-ml,兼容性与驱动功能更完整。
检查与安装示例:
# 识别网卡与驱动
lspci -nn | egrep -i 'ether|infiniband'
modinfo mlx5_core | head -n 5
modinfo i40e | head -n 5
# ELRepo 安装较新内核(示例)
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
sudo yum --enablerepo=elrepo-kernel install -y kernel-lt
sudo grub2-set-default 0 && sudo reboot
现场经验:数据库节点只上 25G,用系统
mlx5_core就够;100G 那台为了 RoCEv2 和更好的 RSS 队列 控制,安装了 MLNX OFED,并 pin 到匹配的内核版本。
五、Linux 网络栈与队列调优(CentOS 7)
5.1 基本链路与 MTU
# 确认链路速率与 FEC(不同驱动字段名略有差异)
ethtool ens2f0 | egrep 'Speed|Duplex|Link detected'
ethtool --show-fec ens2f0 # 新版 ethtool 支持
# 配置 MTU 9000(持久化)
cat >/etc/sysconfig/network-scripts/ifcfg-ens2f0 <<'EOF'
DEVICE=ens2f0
BOOTPROTO=none
ONBOOT=yes
MTU=9000
IPADDR=10.10.25.11
PREFIX=24
GATEWAY=10.10.25.1
DNS1=8.8.8.8
EOF
systemctl restart network || nmcli con reload
5.2 队列与中断亲和
# 查看/设置通道数(RSS 队列)
ethtool -l ens2f0
ethtool -L ens2f0 combined 32 # 结合 CPU 数量与 NUMA 规划
# 放大 ring 缓冲避免突发丢包
ethtool -G ens2f0 rx 4096 tx 4096
# 打开必要的 offload(业务不同策略不同)
ethtool -K ens2f0 tso on gso on gro on lro on rxvlan on txvlan on
# IRQ 绑核(示例把前 32 个队列绑到 NUMA0 的 0-31 号核)
for i in $(ls -d /proc/irq/*/ | egrep -o '[0-9]+' | head -32); do
printf "%x" $((1<<i%32)) > /proc/irq/$i/smp_affinity
done
# 或使用 tuned 简化
tuned-adm profile network-throughput
5.3 TCP 缓冲与系统参数
cat >>/etc/sysctl.d/99-net-tune.conf <<'EOF'
net.core.rmem_max = 268435456
net.core.wmem_max = 268435456
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_mtu_probing = 1
EOF
sysctl --system
现场经验:对吞吐敏感的大包复制(如备库日志)开启 TSO/GRO 有帮助;对低延迟交易路径,反而会关掉 LRO/GRO 并把队列与 CPU pin 得更细。
六、验收方法:iperf3/CPU 占用/时延抖动
测试拓扑:服务器 ↔ ToR 交换机(同一机柜)↔ 服务器。
25G:
# Server A 做服务端
iperf3 -s
# Server C 做客户端(同 VLAN,同 ToR)
iperf3 -c 10.10.25.11 -P 8 -t 60 -M 8972 -f g
100G:
iperf3 -c 10.10.100.21 -P 16 -t 60 -M 8972 -f g
查看 CPU:mpstat -P ALL 1、pidstat -tu 1。
抓包抖动:tcpdump -i ens3f0 -vv -s 128 port 5201。
实测样例(节选)
| 链路 | 插槽/驱动 | MTU | 并发流 | 吞吐(Gbps) | 备注 |
| 25G | PCIe3 x8 / mlx5_core | 9000 | 8 | 24.7~24.9 | 稳定,CPU 35~45% |
| 100G(错误槽位) | PCIe3 x8 / mlx5_core | 9000 | 16 | 68~72 | 槽位电气不足 |
| 100G(正确槽位) | PCIe3 x16 / MLNX OFED | 9000 | 16 | 93~97 | PFC 关闭,RSS=32 |
七、那些真实的坑与现场解法
- 槽位“看起来 x16,实际上 x8”:查主板手册或用
setpci/lspci -vv看LnkSta,换到 CPU 直连的真 x16。 - FEC 不匹配导致 Link flap:交换机
fec rs↔ 网卡侧ethtool --set-fec(或驱动参数)保持一致。 - SFP+ 插到 SFP28 口能亮却只有 10G:这是正常降级;要 25G 必须换 SFP28 模块/线。
- QSFP28 SR4 光纤极性:MPO/MTP 12 芯跳线极性搞错会“亮灯无流量”,换成对应极性或用极性转换器。
- 厂商模组锁:部分交换机对“第三方模块”做校验,需解锁或用兼容编码模块。
- 100G 发热:CX5 满负载芯片温度 80~90℃ 常见;需要风道导流片,或把卡换到风更足的槽位。
- CentOS 7 驱动太老:安装 ELRepo 内核或供应商 DKMS;注意内核-驱动-固件三者版本匹配。
- RoCEv2 抖动:未开/误配 PFC/ETS,先在“无丢包域”内跑通再拓展;如果只是 TCP 复制,不要生搬 PFC。
- numa 远端内存:万兆还好,100G 下 NUMA 远端访问抖动明显,绑队列到本地 NUMA。
- 队列数设太大:不是越多越好,CPU 迁移与 cache 抖动会恶化,结合核心/业务压测选 16/32/64 合理值。
附录 A:常用命令速查
# 查看 PCIe 链路协商速率/宽度
lspci -s <bus:dev.func> -vv | egrep 'LnkCap|LnkSta'
# 查看/设置 FEC
ethtool --show-fec <dev>
ethtool --set-fec <dev> encoding rs # 或 baser/off
# Mellanox 工具
dpkg -l | grep mlnx # 或 rpm -qa | grep mlnx
mstflint -d <pci> q
mlxconfig -d <pci> q | egrep 'SRIOV|LINK_TYPE'
# Intel 工具
nvmupdate64e -i
# 队列/中断
ethtool -l <dev>
ethtool -L <dev> combined 32
cat /proc/interrupts | grep <dev>
# 监控与抓包
sar -n DEV 1
mpstat -P ALL 1
iftop -i <dev>
tcpdump -i <dev> -s 128 -w /tmp/capture.pcap
附录 B:示例 ifcfg 持久化配置(CentOS 7,双口 25G)
# /etc/sysconfig/network-scripts/ifcfg-ens2f0
DEVICE=ens2f0
BOOTPROTO=none
ONBOOT=yes
IPADDR=10.10.25.11
PREFIX=24
MTU=9000
NM_CONTROLLED=no
# /etc/sysconfig/network-scripts/ifcfg-ens2f1
DEVICE=ens2f1
BOOTPROTO=none
ONBOOT=yes
IPADDR=10.10.25.12
PREFIX=24
MTU=9000
NM_CONTROLLED=no
那晚折腾到 5 点,100G 那块卡最终安在了 CPU0 直连的真 x16 槽位,交换机侧强制了 RS-FEC、MTU 9216,对端也对齐。两端 iperf3 稳在 95 Gbps,复制窗口按预期缩了 2/3。出机房门,风一吹,外面天色已经泛白。我掏出手机看着监控曲线一条笔直,终于去吃了碗云吞面。
这次升级让我更确定:网卡速率只是链路的“最后一公里”,想把 25G/100G 跑稳,主板/插槽、电气、风道、线材、FEC、驱动、队列到内核参数,缺一不可。下一次,哪怕客户再催,我也会先把这份清单过一遍,再进机房