3. 物理层瓶颈:网卡性能与配置、网线/光纤质量与类型、交换机端口协商与双工模式
很多人一遇到网络慢,第一反应就是“带宽不够”,然后急着去扩容。其实,很多时候问题出在最底层——物理层。你想想看,数据流就像水流,水管本身如果堵了、破了、或者接口没接好,后面再大的水泵也白搭。
这一章,我们就来聊聊物理层的三个关键环节:网卡、线缆和交换机端口。我个人习惯,排查吞吐瓶颈时,一定先从这三样入手,因为它们最容易被忽略,也最容易“背锅”。
3.1 网卡:吞吐的第一道关卡
网卡是服务器和网络之间的“翻译官”。它的性能直接决定了你能跑多快。我见过太多案例,业务说“网络慢”,结果一查,网卡还在用百兆模式跑,或者驱动版本老得掉牙。
3.1.1 网卡硬件与接口
首先,你得搞清楚你的网卡是什么“体质”。
- 接口类型: 现在主流是 PCIe 3.0/4.0 x8 或 x16。PCIe 版本和通道数决定了网卡和 CPU 之间的带宽。比如,一张 25G 网卡插在 PCIe 3.0 x4 的槽上,理论带宽只有约 4GB/s,根本喂不饱 25G。
- 网卡速率: 1G、10G、25G、40G、100G…… 别只看标称,实际要看协商结果。
- 队列数: 多队列(RSS、Flow Director)能让多个 CPU 核心分担网卡中断,提升并发处理能力。单队列网卡在高吞吐下很容易把单个 CPU 打满。
lspci -vvv | grep -i ethernet,看看网卡型号、PCIe 链路速度和宽度。如果显示 Speed 2.5GT/s, Width x4,那心里就有数了——这卡跑不满 10G。
3.1.2 驱动与固件
驱动和固件是网卡的灵魂。我曾经遇到过一个案例,某批服务器 10G 网卡吞吐死活上不去,只有 2-3Gbps。查了三天,最后发现是驱动版本太旧,有个已知的 bug 导致大包性能下降。升级驱动后,直接跑到 9.8Gbps。
怎么查?
- Linux:
ethtool -i eth0查看驱动和固件版本。 - Windows: 设备管理器 -> 网卡属性 -> 驱动程序选项卡。
然后去官网对比,是不是最新稳定版。别追新,但别用太老的。
3.1.3 网卡卸载功能
现代网卡有很多硬件卸载功能,比如 TSO(TCP 分段卸载)、GSO(通用分段卸载)、LRO(大接收卸载)、RSS(接收端缩放)、Checksum Offload 等。这些功能让网卡硬件分担 CPU 的工作,能显著提升吞吐。
但有时候,它们也会惹麻烦。我记得有一次,某台数据库服务器出现大量 TCP 重传,排查到最后,发现是 LRO 功能导致接收端合并了过大的数据包,被对端丢弃了。关掉 LRO 后,问题解决。
检查卸载状态:
ethtool -k eth0 | grep offload
临时关闭某个卸载功能:
ethtool -K eth0 tso off
ethtool -K eth0 lro off
3.2 网线/光纤:被低估的“隐形杀手”
线缆是物理层最容易被忽视的环节。很多人觉得“线嘛,能通就行”。但线缆的质量、类型、长度,甚至端接工艺,都会直接影响吞吐。
3.2.1 铜缆(网线)
先说最常见的双绞线。你想想看,一根 Cat5e 的线,硬要跑 10G,能稳定吗?
| 类别 | 最大频率 | 最大速率 | 最大距离 | 典型应用 |
|---|---|---|---|---|
| Cat5e | 100 MHz | 1 Gbps | 100 米 | 百兆/千兆以太网 |
| Cat6 | 250 MHz | 1 Gbps (10 Gbps @ 55m) | 100 米 (1G) / 55 米 (10G) | 千兆/短距离万兆 |
| Cat6a | 500 MHz | 10 Gbps | 100 米 | 万兆以太网 |
| Cat7 | 600 MHz | 10 Gbps | 100 米 | 万兆/数据中心 |
| Cat8 | 2000 MHz | 25/40 Gbps | 30 米 | 高速数据中心 |
这里有个坑:很多便宜的 Cat6 线,实际测试连 1G 都跑不稳。我建议,关键链路至少用 Cat6a,并且要用 Fluke 测线仪 测一下串扰和回波损耗。
3.2.2 光纤
光纤比铜缆稳定,但也不是没坑。
- 单模 vs 多模: 单模(SMF)传输距离远(10km+),但成本高;多模(MMF)距离短(几百米),但便宜。别搞混了,单模光模块插多模光纤,或者反过来,虽然能亮,但性能会大打折扣。
- 光纤类型: OM3、OM4、OM5 等。OM4 支持 100G 到 150 米,OM3 只能到 100 米。如果用了 OM3 的线跑 100G,距离一长就丢包。
- 接头清洁: 这是最容易被忽略的。光纤端面脏了,会导致光功率衰减、误码率升高。我见过一个案例,某条 40G 链路吞吐只有 10G,最后用显微镜一看,接头上有块油污。擦干净后,直接跑满。
3.3 交换机端口:协商与双工模式
交换机端口是物理层的“交通指挥员”。它决定了链路两端用什么速度、什么模式通信。
3.3.1 自协商机制
现在的设备默认都开自协商。两端互相“喊话”,确定一个双方都支持的最高速率和双工模式。但自协商不是万能的。
我遇到过最经典的问题:双工模式不匹配。一端是千兆全双工,另一端因为某种原因(比如老旧设备、配置错误)变成了百兆半双工。结果就是:链路能通,但吞吐极低,而且伴随大量冲突和 CRC 错误。
怎么查?
ethtool eth0
看输出中的 Speed 和 Duplex 字段。两端必须一致。
3.3.2 常见协商问题
- 速率不匹配: 一端 1G,另一端 100M。结果就是链路以 100M 运行,吞吐受限。
- 双工不匹配: 一端全双工,另一端半双工。这是最恶心的,因为链路能通,但性能极差。半双工端在发送时会等待,而全双工端不会,导致大量碰撞和重传。
- 自协商失败: 两端都开自协商,但就是协商不上,回退到最低速率(比如 10M)。
3.3.3 排查命令
在 Linux 下,我常用的命令:
# 查看端口协商状态
ethtool eth0
# 查看端口统计信息(错误包、碰撞等)
ethtool -S eth0
# 查看交换机侧(如果可登录)
show interfaces status
show interfaces counters errors
重点关注 CRC errors、collisions、frame errors。这些数字如果持续增长,说明物理层有问题。
3.4 实战排查流程
好了,理论说完了。咱们来点实际的。当你怀疑物理层有瓶颈时,按这个步骤来:
- 第一步:看协商状态。 登录服务器,
ethtool eth0,确认 Speed 和 Duplex 是否和预期一致。如果不一致,先检查线缆和两端配置。 - 第二步:看错误计数。
ethtool -S eth0,看有没有 CRC 错误、碰撞、超长/超短帧。如果有,大概率是线缆或光模块问题。 - 第三步:测线缆。 用测线仪(Fluke)或者简单点,换一根已知好的线缆试试。对于光纤,用光功率计测接收光功率,看是否在模块的接收灵敏度范围内。
- 第四步:检查网卡配置。 确认驱动版本、固件版本、卸载功能状态。可以尝试关闭 TSO/GSO/LRO 看看性能是否有变化。
- 第五步:打流测试。 用 iperf3 打流,看实际吞吐。如果吞吐远低于预期,且排除了以上问题,那可能是网卡硬件故障或 PCIe 瓶颈。