前言

网卡丢包是服务器运维中常见却棘手的问题,轻则导致业务延迟升高,重则造成服务不可用。本文从系统层到硬件层,梳理网卡丢包的常见原因及排查方法。

一、快速定位丢包方向

发现业务异常时,先确认是否为网卡丢包。查看网卡统计信息:

1
2
3
4
5
# 查看网卡接口状态和统计
ip -s link show eth0
cat /proc/net/dev

# 重点关注 drop、fifo、frame、carrier 列是否有非零值

drops 列持续增长,说明网卡正在丢包。进一步查看详细计数:

1
2
# 查看网卡详细错误计数
ethtool -S eth0

二、查看网卡协商状态与工作模式

速率不匹配、双工模式错误是常见丢包原因:

1
2
# 查看网卡协商的速率和双工模式
ethtool eth0

常见异常情况:

  • 速率显示 10Mbps 而预期是 1Gbps
  • 双工模式显示 half 而非 full
  • 协商结果显示 “Unknown!”

发现协商异常时,尝试强制指定速率:

1
2
3
4
5
# 强制千兆全双工
ethtool -s eth0 speed 1000 duplex full autoneg off

# 恢复自动协商
ethtool -s eth0 autoneg on

三、检查网卡驱动和固件

过时或有bug的驱动会导致异常丢包:

1
2
# 查看网卡驱动信息
ethtool -i eth0

关注 driver、version、firmware-version 版本号,与厂商最新版本对比。更新驱动:

1
2
3
# 确认驱动源码
uname -r
# 下载对应版本驱动源码编译安装

四、检查硬件和连接

物理层问题不易从系统层面发现:

1
2
3
4
5
# 检查网卡端口状态灯(设备面板)
# 正常:绿色闪烁;异常:橙色或灭灯

# 更换网线测试,排除网线质量问题
# 交叉测试:更换交换机端口,排除端口故障

使用光模块时,确认模块型号与网卡兼容:

1
2
# 查看光模块信息(部分网卡支持)
ethtool -m eth0

五、系统网络缓冲区检查

内存不足导致 skb 无法分配,会表现为丢包:

1
2
3
4
5
# 查看网络内存统计
cat /proc/net/sockstat

# 查看 ring buffer 大小
ethtool -g eth0

Ring buffer 偏小会导致高速网卡丢包:

1
2
# 增大 ring buffer(需网卡支持)
ethtool -G eth0 rx 4096 tx 4096

六、中断与 CPU 亲和性

中断分配不均会导致部分 CPU 繁忙,网卡驱动无法及时处理数据包:

1
2
3
4
5
# 查看网卡中断号
grep eth0 /proc/interrupts

# 查看每个 CPU 核处理的中断数
watch -n1 'cat /proc/softirqs | grep NET'

将网卡中断绑定到空闲 CPU:

1
2
3
4
5
# 获取网卡中断号
IRQ=$(grep eth0 /proc/interrupts | awk '{print $1}' | tr -d ':')

# 绑定到 CPU 0
echo 1 > /proc/irq/$IRQ/smp_affinity

七、NIC Offload 功能的影响

部分 offload 功能在特定场景下会引起丢包:

1
2
3
4
5
6
7
# 关闭 GRO/GSO/GCO 测试
ethtool -K eth0 gro off gso off

# 关闭 TSO
ethtool -K eth0 tso off

# 观察是否改善,逐步开启各项测试

八、网络队列与流量控制

交换机端开启流量控制时,服务器端未匹配会导致丢包:

1
2
3
4
5
# 查看流量控制状态
ethtool -a eth0

# 关闭或开启 pause 帧
ethtool -A eth0 rx off tx off

检查多队列配置:

1
2
3
4
5
# 确认队列数量
ethtool -l eth0

# 设置队列数(需网卡支持)
ethtool -L eth0 combined 8

九、综合排查思路总结

步骤 检查项 工具/命令
1 确认丢包存在 ip -s link show
2 查看网卡状态 ethtool eth0
3 检查驱动版本 ethtool -i eth0
4 检查物理连接 面板灯/换网线
5 检查缓冲区 ethtool -g eth0
6 检查中断分布 /proc/interrupts
7 测试 offload ethtool -K
8 检查流量控制 ethtool -a eth0

结语

网卡丢包排查需由表及里,从系统统计到驱动、从驱动到硬件逐层定位。建议在故障恢复后建立监控基线,将 ethtool -S 的关键计数器纳入采集范围,便于提前发现隐患。