Linux dropped原因及解决方案
导读:Linux dropped 的含义与定位思路 在 Linux 系统中,dropped 表示“已被接收或进入处理流程但因资源不足、策略或错误等原因被丢弃”的数据包计数。不同工具/层级的含义略有差异: 接口层统计(如 ifconfig 的 R...
Linux dropped 的含义与定位思路
在 Linux 系统中,dropped 表示“已被接收或进入处理流程但因资源不足、策略或错误等原因被丢弃”的数据包计数。不同工具/层级的含义略有差异:
- 接口层统计(如 ifconfig 的 RX dropped):数据包已进入网卡 Ring Buffer,但在拷贝到内核内存或后续处理时因资源不足被丢弃;注意接口层还可能将部分 L2 过滤丢弃计入该计数。
- 驱动/RX 错误(如 RX errors / RX overruns):RX errors 包含过长帧、CRC 错误、帧同步错误、FIFO 溢出、missed 等;RX overruns 表示 Ring Buffer 溢出,通常是网卡 DMA 速度快于内核处理速度导致。
- 内核协议栈/队列(如 /proc/net/softnet_stat 第二列):表示因 netdev_max_backlog 队列溢出被丢弃的数据包(软中断来不及处理)。
- Socket/应用层(如 netstat -s 的 sk_drops):应用未及时取包或内核 socket 缓存不足导致的丢弃。
- 连接跟踪(如 nf_conntrack 表满):连接跟踪条目用尽时,新建连接的数据包会被丢弃。
常见原因与对应解决方案
| 层级/位置 | 典型计数或日志 | 常见原因 | 快速检查 | 解决方案 |
|---|---|---|---|---|
| 网卡驱动/Ring Buffer | ifconfig 的 RX dropped、ethtool -S 的 rx_missed_errors / rx_fifo_errors | Ring Buffer 或 FIFO 溢出;中断/软中断处理不及时;单核软中断打满 | ethtool -g eth0;ethtool -S eth0 | 增大 Ring Buffer(ethtool -G rx);提升软中断处理能力(见下节);均衡中断与队列 |
| 内核 backlog 队列 | /proc/net/softnet_stat 第二列非零 | 接收速率 > 内核协议栈处理速率 | cat /proc/net/softnet_stat | 提高 netdev_max_backlog;优化软中断与 CPU 亲和 |
| 连接队列(TCP) | netstat -s | grep -i listen 出现 SYNs to LISTEN sockets dropped;ss -lnt 中 Recv-Q 长期接近 Send-Q | ss -lnt;netstat -s | 提高 net.core.somaxconn 与 tcp_max_syn_backlog;必要时开启 tcp_syncookies;应用及时 accept |
| 防火墙/连接跟踪 | dmesg | grep nf_conntrack;iptables-save | dmesg;iptables-save -t filter | 扩容 nf_conntrack(如 nf_conntrack_max);优化规则/超时;必要时绕过连接跟踪 |
| ARP/二层转发 | 无直接计数(现象为不通/偶发丢包) | arp_ignore/arp_filter 配置不当;多网卡 ARP 应答冲突 | sysctl -a | grep arp_ |
| UDP 应用 | netstat -su;应用层丢包计数 | 校验和错误、长度错误;应用消费慢;socket 接收缓冲不足 | 抓包;ss -u ln;/proc/sys/net/core/rmem_default/max | 修正应用协议与校验;增大 rmem;应用异步/批量消费 |
| 内核日志缓冲区 | 控制台提示 printk messages dropped | 内核日志产生过快,缓冲区满 | dmesg | 调整日志级别/缓冲区;排查触发原因(硬件/驱动/异常) |
以上要点与命令示例可快速定位大多数 dropped 场景并给出对应处置方向。
系统化排查步骤
- 先看接口层计数
- 执行:ifconfig eth0 或 ip -s link show dev eth0,关注 RX dropped / RX errors / RX overruns。
- 若 RX errors / overruns 增长,优先怀疑 Ring Buffer 与驱动处理能力;若仅 RX dropped 增长,可能是资源不足或策略丢弃。
- 检查驱动队列与中断负载
- 查看 Ring Buffer:ethtool -g eth0;必要时增大(ethtool -G rx 8192)。
- 查看软中断与 CPU:mpstat -P ALL 1,观察是否有 %soft 单核打满。
- 调整软中断处理预算:sysctl -w net.core.netdev_budget=600(默认 300)。
- 均衡中断与队列:ethtool -x eth0 查看 RSS;必要时用 ethtool -X eth0 调整队列分布。
- 检查内核 backlog 队列
- cat /proc/net/softnet_stat,若某 CPU 第二列持续非零,说明 netdev_max_backlog 溢出。
- 处置:sysctl -w net.core.netdev_max_backlog=2000(或更高,视带宽与 CPU 而定)。
- 检查 TCP 连接队列
- ss -lnt:观察 Recv-Q(当前排队)与 Send-Q(最大排队,即 min(应用 backlog, somaxconn))。
- netstat -s | grep -i listen:若出现 SYNs to LISTEN sockets dropped,提高 net.core.somaxconn 与 tcp_max_syn_backlog;必要时开启 tcp_syncookies 与 tcp_abort_on_overflow。
- 检查防火墙与连接跟踪
- iptables-save -t filter:确认无意外 DROP 规则。
- dmesg | grep nf_conntrack:若出现 “table full, dropping packet”,扩容 nf_conntrack_max 或优化规则/超时。
- 检查二层转发与 ARP
- sysctl -a | egrep “arp_ignore|arp_filter”:按多网卡/NAT 场景设置合适值,避免错误应答导致后续报文被丢弃。
- 检查 UDP 与应用层
- 抓包确认是否有 checksum error / length error;netstat -su 观察 packet receive errors。
- 增大 socket 接收缓冲:/proc/sys/net/core/rmem_default 与 rmem_max;应用侧采用异步/批量消费。
- 若看到内核日志 “printk messages dropped”
- 调整内核日志级别与缓冲区,排查触发源(硬件/驱动/异常),避免日志拥塞掩盖根因。
常用参数与命令速查
- 接口与驱动
- ethtool -g eth0:查看 Ring Buffer
- ethtool -G eth0 rx 8192:增大接收环
- ethtool -x/-X eth0:查看/调整 RSS 队列
- 内核网络
- sysctl -w net.core.netdev_max_backlog=2000
- sysctl -w net.core.netdev_budget=600
- sysctl -w net.core.somaxconn=4096
- sysctl -w net.ipv4.tcp_max_syn_backlog=4096
- sysctl -w net.ipv4.tcp_syncookies=1
- sysctl -w net.ipv4.tcp_abort_on_overflow=1
- 连接跟踪
- dmesg | grep nf_conntrack
- 调整 /proc/sys/net/netfilter/nf_conntrack_max(需评估内存)
- 统计与抓包
- cat /proc/net/dev;cat /proc/net/softnet_stat
- ifconfig;ip -s link;ss -lnt;netstat -s;ethtool -S
- tcpdump -ni eth0 port < 端口> -vv
实践建议
- 优先从“计数增长 + 资源瓶颈”定位:先看接口层与软中断,再看 backlog/队列,最后到防火墙/连接跟踪与应用层。
- 变更参数遵循“小步快跑 + 压测验证”,避免一次性大幅调大参数导致副作用。
- 对 UDP 高并发场景,务必在应用侧实现异步处理与速率控制,并合理设置 rmem。
- 多核服务器务必关注 RSS/中断亲和 与 软中断分布,避免单核成为瓶颈。
- 若伴随内核日志拥塞,先恢复日志可见性,再回溯根因,防止“日志丢失”掩盖真实问题。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux dropped原因及解决方案
本文地址: https://pptw.com/jishu/756439.html
