Android系统常见有线网卡丢包问题的调试排查方案

发布于:2025-06-25 ⋅ 阅读:(21) ⋅ 点赞:(0)

​一、网卡驱动与接口队列溢出排查​

查看网卡统计信息​

cat /proc/net/dev

 关键字段解读​​:

  • errors:硬件错误计数(如CRC校验失败)
  • dropped:驱动或内核因缓冲区满丢弃的包数
  • overruns:网卡FIFO缓冲区溢出(表明数据到达速度超过内核处理能力)
  • ​问题定位​​:若droppedoverruns持续增长,需优化队列设置

调整网卡队列缓冲区:

# 查看当前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);

​作用​​:避免高吞吐场景下因应用处理不及时导致的丢包


网站公告

今日签到

点亮在社区的每一天
去签到