Linux dropped如何检测
小樊
43
2025-11-16 05:38:53
Linux dropped 检测与定位
一 快速判定是否存在 dropped
- 查看网卡层计数:运行命令查看接口统计中的 RX-DRP/RX-OVR。例如:
- ifconfig eth0
- netstat -i
- cat /proc/net/dev
关键字段含义:RX-DRP 表示包已进入网卡的 Ring Buffer 但因系统原因(如内存不足)在拷贝到内存时被丢弃;RX-OVR 表示 FIFO/驱动队列 溢出,多为网卡来不及把包交给内核导致。若这些数值随时间增长,即存在丢包。也可用 ethtool -S 查看更细的驱动层计数(如 rx_fifo_errors、rx_missed_errors 等)。
二 判断丢包发生在哪一层
- 链路层/驱动层:若 RX-DRP 或 ethtool -S 中的 rx_fifo_errors/rx_over_errors 增长,多为链路/驱动队列瓶颈或中断/软中断处理不及时。
- 网络层/策略层:检查是否配置了 TC 限速/丢包策略(如 netem),以及 iptables/nftables 的 DROP/REJECT 规则;这些会直接丢弃报文。
- 连接跟踪/路由层:查看 conntrack 是否溢出(dmesg | grep conntrack)、以及 rp_filter 反向路径过滤是否导致报文被丢弃(cat /proc/sys/net/ipv4/conf/eth0/rp_filter;必要时开启 martian 日志:sysctl -w net.ipv4.conf.all.log_martians=1)。
- 传输层(TCP逻辑丢包):通过 netstat -s 观察 TCPLoss、重传、超时 等指标是否异常,用于判断是否为拥塞或链路不稳定导致的“逻辑丢包”。
三 内核态精确追踪丢包位置
- 使用 dropwatch 实时观察内核丢包热点函数:
- 使用 perf 跟踪内核释放 skb 的位置:
- perf record -g -a -e skb:kfree_skb
- perf script
- 使用 bcc/eBPF 的 tcpdrop 观察 TCP 层被丢弃的数据包:
- 使用 systemtap 脚本聚合 kfree_skb 调用点:
- /usr/share/doc/systemtap-1.6/examples/network/dropwatch.stp
以上方法可帮助定位具体的内核函数/路径,从而明确是哪一环节丢弃了数据包。
四 端到端验证与抓包定位
- 先用 ping / hping3 验证连通性与丢包率,再用 traceroute 定位路径中异常跳数;必要时在问题主机或对端进行 tcpdump 抓包,结合 Wireshark 分析握手、重传、窗口与 MTU 问题。抓包可验证是主机侧丢弃还是网络路径问题,并辅助确认 MTU 是否过小导致的分片/丢包。
五 常见现象与处理要点
- RX-DRP 增长:优先检查系统资源(内存/CPU)、中断与软中断负载、驱动队列大小;必要时通过 ethtool -G rx 增大接收环缓冲,观察是否缓解。
- RX-OVR/rx_fifo_errors 增长:多为网卡 FIFO 溢出,通常与中断不均衡、CPU 处理能力不足或突发流量有关;可优化中断亲和、提升软中断处理能力,或适度增大驱动队列。
- netstat -s 中 TCPLoss/重传升高:偏向“逻辑丢包”,重点排查网络拥塞、链路质量与对端处理瓶颈;结合抓包确认是否因丢包触发超时重传。
- iptables/TC 规则导致丢包:审计规则与策略(如随机丢包、限速),在问题窗口期临时移除验证;对 rp_filter 引发的“martian”报文,核对路由与接口策略后决定是否放宽或记录日志。