网卡丢包不是单一原因造成的。线缆老化、光模块衰减、Ring Buffer溢出、中断亲和性配置不当——每一层都可能成为瓶颈。本文提供一套从物理层到系统层的分层排查方法,配合 ethtool、ifconfig、dmesg 等诊断命令,帮你快速定位丢包根因。
运维老张被一条告警叫醒:核心业务服务器的 TCP 重传率从 0.01% 飙到 2.3%,应用层响应超时频繁触发。登录机器一看,ifconfig 的 RX dropped 计数在持续跳动。
这种场景并不罕见。丢包的棘手之处在于——它可能发生在数据路径的任何一环。从网线接头氧化到内核协议栈参数不合理,排查思路必须是分层递进的,而不是一上来就怀疑网卡坏了。
超过 40% 的"网卡丢包"最终定位到物理层。排查从这里开始成本最低。
电口场景(RJ45):
ethtool eth0 查看协商速率,如果显示 100Mbps 而非 1000Mbps,大概率是线缆质量问题光口场景(SFP/SFP28):
ethtool -m eth0 读取光模块的收发光功率(Rx Power / Tx Power)如果丢包呈现"间歇性、与温度/湿度相关、换线后消失"的特征,90%是物理层问题。不要急着调系统参数。
排除物理层后,下一步看网卡和交换机端口本身。
网卡硬件状态检查:
# 查看网卡错误计数
ethtool -S eth0 | grep -i "error\|drop\|miss"
# 查看PCIe链路协商状态(确认没有降速)
lspci -vvv -s $(ethtool -i eth0 | grep bus-info | awk '{print $2}') | grep LnkSta
# 查看内核日志中的网卡告警
dmesg | grep -i "eth0\|link\|error" | tail -20
如果 ethtool -S 输出中 rx_missed_errors 持续增长,说明网卡硬件接收队列来不及处理——这通常指向 Ring Buffer 太小或中断处理不及时,而非网卡本身故障。
交换机端口侧:
千兆环境下,LREC9714HT 四口 RJ45 网卡基于 Intel I350 主控,硬件层面支持 TCP/UDP/IP 校验和卸载和 TCP 分段,能有效降低因 CPU 处理不及时导致的接收丢包。四端口设计支持链路聚合,单口故障时可自动切换。
这是丢包排查中最复杂、也最常出问题的层级。
Ring Buffer 检查与调整:
# 查看当前ring buffer大小
ethtool -g eth0
# 典型输出:
# Ring parameters for eth0:
# Pre-set maximums:
# RX: 4096
# Current hardware settings:
# RX: 512 ← 如果远小于最大值,考虑调大
# 调大RX ring buffer
ethtool -G eth0 rx 2048
Ring Buffer 是网卡 DMA 写入和内核驱动读取之间的缓冲区。流量突发时,如果 Buffer 太小,驱动来不及取走数据,新包就会被硬件丢弃。25G 网卡在满负载下每秒处理约 3700 万个 64 字节小包,Ring Buffer 建议设为最大值的一半以上。
中断亲和性(IRQ Affinity):
# 查看网卡中断分布
cat /proc/interrupts | grep eth0
# 如果所有中断集中在CPU0,需要手动分散
# 将eth0-rx-0绑定到CPU2
echo 4 > /proc/irq/$(grep eth0-rx-0 /proc/interrupts | awk -F: '{print $1}')/smp_affinity
中断全部打到单核是高速网卡丢包的头号系统层原因。10G 以上网卡通常支持多队列(RSS),确保每个队列的中断分散到不同 CPU 核心。
升级内核后丢包突然增多?检查驱动是否被内核自带的 in-tree 版本覆盖。运行 ethtool -i eth0 对比 driver 和 firmware-version 字段,确认使用的是厂商提供的最新驱动。
10G 电口场景推荐 LREC9812BT,基于 Intel X550 主控,支持 2.5G/5G/10G 多速率自适应,兼容现有 Cat6/Cat6a 铜缆布线。硬件级 RSS 多队列支持配合中断亲和性调优,在 10G 满负载下也能保持零丢包。
当网络升级到 25G 或更高速率后,丢包排查还需要关注额外维度:
LRES1027PF-4SFP28 四口 25G SFP28 网卡采用 PCIe 4.0 x8 总线,单卡提供 100Gbps 总带宽。硬件支持 iWARP 和 RoCE v2 RDMA 卸载,在 DPDK 或 RDMA 场景下可绕过内核协议栈,从根本上消除系统层丢包风险。
调整完成后,用以下方法确认丢包已消除:
# 持续监控丢包计数(每2秒刷新)
watch -n 2 'ethtool -S eth0 | grep -i "drop\|miss\|error"'
# 用iperf打满带宽测试30分钟
iperf -c 192.168.1.100 -t 1800 -P 4
# 测试期间观察softirq CPU占用
mpstat -P ALL 1 5
验证标准:30 分钟满负载测试期间,rx_missed_errors 和 rx_dropped 计数增量为 0,iperf 报告无重传。
丢包排查的铁律:从下往上,逐层排除。物理层占 40% 以上案例,系统层(Ring Buffer + 中断)占 35%,真正的网卡硬件故障不到 10%。不要跳过线缆检查直接换网卡。
在服务器端运行 ethtool -S eth0 | grep rx_missed,同时登录交换机查看对应端口的 Input errors。如果网卡侧计数增长而交换机侧不变,丢包发生在服务器内部(Ring Buffer 溢出或驱动问题);如果交换机端口也有 Input errors,问题在线缆或网卡物理层。两端同时计数则需逐段排查。
没有统一答案,取决于流量模型。突发流量大的场景(如存储集群、视频转码)建议设为网卡支持最大值的 50%-75%;持续稳定流量(如数据库主从同步)设为默认值即可。过大的 Ring Buffer 会增加延迟,对时延敏感的业务(金融交易)不宜盲目调大。用 ethtool -g eth0 查看当前值和最大值。
不一定。如果丢包原因是 Ring Buffer 配置不当或中断集中在单核,换网卡不会解决问题。但如果现有网卡是百兆/千兆卡跑满了带宽导致硬件队列溢出,升级到 10G(如 LREC9812BT)或 25G(如 LRES1027PF-4SFP28)可以从根本上消除带宽瓶颈导致的丢包。
这条日志表示网卡检测到链路断开。常见原因:网线/光纤被碰松、交换机端口被管理员关闭、光模块故障。如果频繁出现 Link Down/Up 交替(flapping),优先检查物理连接和光模块兼容性,其次检查网卡固件是否需要升级。
运行 ethtool -l eth0 查看 Combined 队列数,再用 cat /proc/interrupts | grep eth0 确认中断分散在多个 CPU 核心。如果只看到 eth0-rx-0 一个中断,说明 RSS 未启用或驱动不支持。对于支持多队列的网卡(如 Intel X550、E810 方案),可通过 ethtool -L eth0 combined 8 手动设置队列数。