温馨提示×

Linux dropped怎么报告

小樊
34
2026-01-08 07:30:00
栏目: 智能运维

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"; }

# 1) 接口计数快照与增量
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

# 2) 软中断/backlog 统计
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"

# 3) Socket 队列
log "[3] 监听队列与已建立连接队列(单位:字节)"
ss -lntu | column -t | tee -a "$LOG"

# 4) 路径丢包
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 是否回落。

0