Linux dropped 报告与定位
一、报告目标与总体思路
- 明确“dropped”发生在哪一层:是网卡/驱动层(ifconfig/ip 看到的 RX/TX dropped)、内核网络栈(如 backlog 队列溢出)、还是Socket 缓冲/应用层(ss 的 Recv-Q/Send-Q 堆积)。
- 形成可复现的“证据包”:包括当前计数快照、短时间增量、历史趋势、路径丢包定位、以及内核丢包点(如有)。
- 输出建议包含:时间戳、主机与接口、指标与增量、关键配置(如队列、Ring Buffer、中断亲和)、可能原因与下一步。
二、快速定位与命令清单
- 接口层计数(当前值与增量)
- 当前快照:ip -s link show dev eth0;或 cat /proc/net/dev | grep eth0
- 5 秒增量示例:
- RX/TX dropped:ip -s -s link show dev eth0 | egrep ‘RX.*dropped|TX.*dropped’ | awk ‘{print $2,$NF}’;对比 5 秒前后
- 错误与超限:关注 RX/TX 的 errors、overruns、carrier、collisions
- 历史趋势(若安装了 sysstat)
- sar -n DEV 1 60(每秒采样,共 60 次),观察 rx/txpck/s、rx/txkB/s 与错误项
- 内核网络栈与队列
- CPU 软中断队列积压:cat /proc/net/softnet_stat(第 2 列为 dropped,按 CPU 行查看)
- Socket 队列堆积:ss -lntu(Recv-Q 在 LISTEN 为全连接队列;在 ESTABLISHED 为已收未读字节)
- 路径丢包定位
- 端到端丢包率:ping -c 100 8.8.8.8
- 逐跳丢包与延迟:mtr --report --report-cycles 100 8.8.8.8(可导出 CSV 归档)
- 抓包取证
- tcpdump -i eth0 -nn -s0 -c 1000 ‘icmp or (tcp port 80)’ -w pkt.pcap(必要时加 -G/-W 做滚动抓包)
- 内核丢包点(可选)
- dropwatch(需 root):dropwatch -l kas | grep -i drop(定位内核哪些位置丢弃)
三、一键可复制的丢包报告脚本
- 功能:采集接口计数、增量、软中断统计、队列与路径丢包,并给出简要判断。
- 用法:保存为 report_dropped.sh,chmod +x 后执行:sudo ./report_dropped.sh [接口名,如 eth0]
- 说明:依赖 ip、sar(可选)、mtr、ss、cat/proc。
#!/usr/bin/env bash
set -Eeuo pipefail
IF=${1:-eth0}
INTERVAL=5
LOG="dropped_report_$(date +%F_%H%M%S).log"
log() { echo "$(date '+%F %T') $*" | tee -a "$LOG"; }
log "[1] 接口 $IF 计数(当前)"
ip -s -s link show dev "$IF" | tee -a "$LOG"
log "[1] 接口 $IF 计数($INTERVAL 秒增量)"
for f in rx tx; do
for m in packets errors dropped overruns; do
cur=$(ip -s -s link show dev "$IF" | awk -v f="$f" -v m="$m" \
'$0 ~ f" +"m":" {gsub(/,/,"",$2); print $2; exit}')
sleep "$INTERVAL"
nxt=$(ip -s -s link show dev "$IF" | awk -v f="$f" -v m="$m" \
'$0 ~ f" +"m":" {gsub(/,/,"",$2); print $2; exit}')
inc=$((nxt - cur))
printf "%-8s %-8s +%d\n" "$f:$m" "$cur" "$inc" | tee -a "$LOG"
done
done
log "[2] /proc/net/softnet_stat(每 CPU 第2列为 dropped)"
cat /proc/net/softnet_stat | awk '{printf "CPU%-2d dropped=%s\n", NR-1, $2}' | tee -a "$LOG"
log "[3] 监听队列与已建立连接队列(单位:字节)"
ss -lntu | column -t | tee -a "$LOG"
log "[4] ping 100 个包到 8.8.8.8"
ping -c 100 8.8.8.8 | tail -n 3 | tee -a "$LOG"
log "[4] mtr 100 周期报告(CSV 已保存)"
mtr --report --report-cycles 100 8.8.8.8 --report-csv > "mtr_$(date +%F_%H%M%S).csv"
tail -n 5 "mtr_$(date +%F_%H%M%S).csv" | tee -a "$LOG"
log "[DONE] 报告已保存到: $LOG 及 mtr CSV 文件"
四、结果解读与常见根因
- 接口层含义
- RX dropped:包已进入网卡/驱动 Ring Buffer,但在拷贝到内核内存时被丢弃(常见与内存压力、驱动/队列配置相关)。
- RX/TX overruns:Ring Buffer 溢出,通常是网卡速率高、CPU 处理不及时/中断不均衡导致来不及取包。
- carrier/collisions:物理层/双工/线缆问题或冲突(半双工环境)。
- 内核与队列
- /proc/net/softnet_stat 第 2 列 dropped 增长:CPU 软中断处理队列(backlog)拥塞,常见于软中断集中到少数核、CPU 过载或 RPS/RFS 配置不当。
- ss Recv-Q/Send-Q 堆积:应用未及时消费(接收)或对端窗口/ACK 问题(发送),需结合应用日志与抓包判断。
- 路径与远端
- ping/mtr 显示某跳或远端丢包:多为链路拥塞、限速、ACL/防火墙或远端问题,需协同网络侧排查。
五、生成可提交的报告模板
- 基本信息
- 时间范围:2026-01-08 10:00–10:10
- 主机/接口:server01 / eth0
- 内核/发行版:Linux 5.15 / Ubuntu 22.04
- 关键指标
- RX dropped:12345(+678,5s)
- RX overruns:234(+56)
- softnet_stat dropped:CPU0 12,CPU1 9
- ss Recv-Q/Send-Q:ESTAB 最大 1.2MB
- 路径证据
- ping 100 包丢包率:2%
- mtr 报告:第 5 跳丢包 15%
- 配置快照
- Speed/Duplex:ethtool eth0 | grep -i speed;ethtool eth0 | grep -i duplex
- 队列/中断:ethtool -g eth0;ethtool -l eth0;/proc/interrupts 分布
- 初步判断
- 软中断集中在 CPU0,伴随 RX overruns 增长,疑似中断亲和/队列配置导致 Ring Buffer 溢出。
- 下一步
- 调整 RPS/RFS/中断亲和,适度增大 Ring Buffer,复测并观察 overruns/dropped 是否回落。