一、网卡驱动与接口队列溢出排查
查看网卡统计信息
cat /proc/net/dev
关键字段解读:
errors
:硬件错误计数(如CRC校验失败)dropped
:驱动或内核因缓冲区满丢弃的包数overruns
:网卡FIFO缓冲区溢出(表明数据到达速度超过内核处理能力)- 问题定位:若
dropped
或overruns
持续增长,需优化队列设置
调整网卡队列缓冲区:
# 查看当前Ring Buffer大小
ethtool -g eth0
# 增大RX/TX缓冲区(需root权限)
ethtool -G eth0 rx 4096 tx 4096
作用:扩大网卡硬件的接收/发送队列,避免因瞬时流量激增导致丢包
优化中断均衡:
# 查看中断分布
cat /proc/interrupts
# 绑定网卡中断到特定CPU(例:将eth0中断绑定至CPU0)
echo 1 > /proc/irq/<IRQ编号>/smp_affinity
适用场景:多核设备中,将网卡中断分散到不同核心,避免单核过载引发丢包
二、内核协议栈丢包诊断与优化
检查协议栈丢包统计
cat /proc/net/softnet_stat
- 输出解读(每行3列十六进制数):
- 第一列:已处理网络帧总数
- 第二列:因
netdev_max_backlog
满导致的丢包数 - 第三列:软中断合并处理的帧数
- 问题定位:若第二列数值持续增加,需调整内核队列长度
调整内核队列参数
# 查看当前队列容量
sysctl net.core.netdev_max_backlog
# 增大接收队列(临时生效,需root)
sysctl -w net.core.netdev_max_backlog=30000
# 增加单次软中断处理包数(默认300,提升至1024)
sysctl -w net.core.netdev_budget=1024
原理:扩大内核缓存队列,允许协议栈在繁忙时暂存更多数据包
三、Socket层丢包分析与优化
检查UDP/TCP Socket状态
# 查看UDP Socket缓存统计
cat /proc/net/udp
# 关键字段:
# rx_queue:接收队列中待处理包数量
# drops:因缓冲区满丢弃的包数[6,9](@ref)
调整Socket缓冲区大小
# 查看默认接收缓冲区
sysctl net.core.rmem_default
# 增大接收缓冲区上限(16MB)
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.rmem_default=16777216
# 应用层需同步设置(Java示例)
socket.setReceiveBufferSize(16 * 1024 * 1024);
作用:避免高吞吐场景下因应用处理不及时导致的丢包