Linux dropped 的含义与典型症状
概念与范围
在 Linux 网络统计中,dropped 表示数据包已进入网卡或内核的接收路径,但在拷贝到内核内存、排队等待处理或内核协议栈处理阶段被丢弃,不等同于物理链路错误。常见计数位置包括:
- 接口层:ifconfig/ethtool 中的 RX dropped(进入 Ring Buffer 后因系统原因丢弃,如内存不足、软中断拥塞等)。
- 内核层:/proc/net/softnet_stat 的 drop 计数(Softnet backlog 满等)。
- 协议/套接字层:netstat -s 中 UDP 的 packet receive errors、receive buffer errors 等。
- 队列/连接:TCP 半连接队列(backlog) 或 全连接队列(accept queue) 溢出导致的丢弃。
- 安全/策略:iptables/nftables DROP 规则、nf_conntrack 表满导致的丢弃。
典型症状与对应计数
| 症状 |
常见计数或日志表现 |
可能原因 |
| 访问变慢、偶发超时或断连,ping 显示高丢包率 |
ping 丢包率如10%~30%;traceroute 某跳开始丢包 |
网络配置异常(MTU/路由)、带宽/CPU/内存瓶颈、驱动/安全软件问题 |
| 新连接建立困难或握手失败 |
netstat -s 中 TCP 出现多次超时/重试;/proc/net/softnet_stat 的 drop 增长;半连接队列满 |
backlog 不足、SYN 洪泛、内核处理拥塞 |
| 已建立连接吞吐下降、时延抖动 |
TCP 重传增多、窗口缩小;应用日志 timeout/reset |
队列溢出、内核/应用处理不过来 |
| UDP 大流量或突发时丢包 |
netstat -s -u:packet receive errors 增长、receive buffer errors 增长 |
socket 接收缓冲不足、应用消费慢 |
| 抓包能看见报文但应用收不到 |
内核丢包工具显示 kfree_skb 或 dropwatch 定位到内核路径 |
内核路径资源不足/策略丢弃(如未知 VLAN/协议) |
| 防火墙/策略导致“全丢或部分丢” |
iptables-save 存在 DROP 规则;nf_conntrack 日志或 table full |
安全策略误拦截、连接跟踪表满 |
| 仅在特定大小或 MTU 下异常 |
ifconfig/ethtool 见 length_errors;ping -M do 失败 |
MTU 不匹配/分片失败、巨帧配置问题 |
快速自检命令
- 连通性与路径:ping 目标 -c 20;traceroute 目标;ip a / route -n 检查地址与路由。
- 接口层计数:ifconfig 或 ip -s link;ethtool -S | egrep “rx_.*errors|rx_dropped|rx_over_errors”;ethtool -g 查看/调整 ring buffer。
- 内核与协议栈:cat /proc/net/softnet_stat;netstat -s 与 netstat -s -u;必要时查看 dmesg 是否有 nf_conntrack: table full。
- 策略与安全:iptables-save -t filter;检查是否启用可能影响 NAT/TCP 的 tcp_tw_recycle 等参数。
- 内核丢包定位:dropwatch -l kas → start;或 perf record -g -a -e skb:kfree_skb && perf script。
补充说明
- dropped 不必然导致系统崩溃:轻微丢包通常只影响业务可用性;但严重情况下(如资源耗尽触发 OOM、内核异常/恐慌、硬件故障)可能间接引发宕机。
- dropped 与 overruns 的区别:前者多为进入 Ring Buffer 后在系统/内核侧被丢弃;后者是 FIFO 溢出,常在驱动/中断处理不及时时增长,指向网卡/CPU 处理能力不足。