温馨提示×

Linux dropped技术探讨

小樊
174
2025-11-28 04:04:24
栏目: 智能运维

Linux dropped 技术探讨

一 概念与分层定位

  • 在 Linux 网络栈中,dropped 表示数据包在接收路径上被内核或驱动“有意丢弃”,不等同于物理层错误。常见计数含义:
    • RX errors:总错误数(如 CRC、frame、过长帧等)。
    • RX dropped:已进入网卡 Ring Buffer,但在拷贝到内核内存/协议栈过程中因资源不足被丢弃(常见于内存紧张、处理不及时)。
    • RX overruns/fifo:网卡 Ring Buffer 溢出,通常因驱动/CPU 来不及消费导致(在 /proc/net/dev 的 fifo 字段增长,在 ifconfig 中体现为 overruns 增长)。
  • 接收路径简述:网卡 DMA 写入 Ring Buffer → 触发硬中断 → 驱动启动 NAPI/软中断 → 内核将包放入 socket buffer → 应用读取。任一环节处理不及都会表现为 dropped/overruns 增长。

二 快速定位流程

  • 第一步 接口层总览
    • 查看接口统计:cat /proc/net/dev 与 ifconfig,关注 RX dropped、RX errors、fifo/overruns 的增长趋势,先判断是“拷贝阶段丢包”还是“硬件/驱动阶段丢包”。
  • 第二步 硬件与驱动
    • 查看 Ring Buffer 与是否溢出:ethtool -S <iface> | grep rx_fifo,cat /proc/net/dev 的 fifo 字段;必要时用 ethtool -g <iface> 查看/调整 Ring Buffer 大小,用 ethtool -G <iface> rx 4096 增大接收环。
    • 检查协商与物理层:ethtool <iface> 看 Speed/Duplex/Autoneg;异常时 ethtool -r <iface> 重协商,必要时 ethtool -s <iface> speed 1000 duplex full autoneg off 强制设置;同时排查 CRC errors、length_errors 等物理层计数。
  • 第三步 内核网络栈队列
    • 软中断与 backlog 队列:cat /proc/net/softnet_stat 观察每核第二列(backlog 溢出丢弃);若增长,提高 net.core.netdev_max_backlog(如 2000)。
    • 软中断预算:sysctl -w net.core.netdev_budget=600(默认 300)以允许软中断处理更多包;若单核 softirq 占用过高,结合中断亲和与 RSS 队列分散负载:mpstat -P ALL 1、ethtool -x/-X <iface>。
  • 第四步 协议栈与策略
    • 连接队列:半连接队列(net.ipv4.tcp_max_syn_backlog)、全连接队列(somaxconn 与 listen(backlog))。netstat -s | grep -i listen 或 dmesg | grep "TCP: drop open request" 发现 SYN 丢弃;netstat -ant | grep SYN_RECV | wc -l 观察半连接堆积。
    • 反向路径与 martian:cat /proc/sys/net/ipv4/conf/<iface>/rp_filter,必要时 sysctl -w net.ipv4.conf.all.log_martians=1 记录异常源。
    • 防火墙/策略:iptables-save | grep -i drop、iptables -L INPUT -nv 观察命中计数是否增长。
    • 连接跟踪:dmesg | grep conntrack 检查 conntrack 表溢出迹象。

三 常见根因与对策

现象 关键指标 常见根因 对策
应用收 UDP 丢包 RX dropped 增长,应用消费慢 socket 接收缓冲不足/应用读慢 增大应用层 SO_RCVBUF;系统层提高 net.core.rmem_max/rmem_default(如 25MB);必要时提高 net.core.netdev_max_backlog
高速链路偶发丢包 fifo/overruns 增长 Ring Buffer 小、软中断处理不及、中断集中 ethtool -G 增大 RX Ring;netdev_budget 调大;中断亲和与 RSS 分散;netdev_max_backlog 调高
新连接建立失败 SYNs to LISTEN sockets dropped 半连接/全连接队列溢出、SYN Flood 提升 tcp_max_syn_backlog、somaxconn;启用 SYN Cookies;应用及时 accept();清洗/限流恶意源
跨接口/多宿主错包 rp_filter 丢弃 反向路径校验不匹配 依据拓扑设置 rp_filter(0/1);必要时开启 log_martians 定位
特定流量被丢弃 iptables DROP 计数增长 策略过严、误匹配 审计并优化规则,使用更精确的匹配与日志
物理层/协商异常 CRC errors、length_errors、协商异常 线缆/光模块/对端端口问题、MTU 不匹配 更换介质/端口;重新协商或强制速率;校验 MTU 与 PATH MTU
NAT/时间戳异常 SYN 不回 ACK、连接异常 服务端启用 tcp_tw_recycle 与 NAT 时间戳混乱 禁用 tcp_tw_recycle;合理设置 tcp_max_tw_buckets 与 tcp_tw_reuse(按场景)
conntrack 表满 dmesg conntrack 溢出 高并发短连接、表项不足 增大 nf_conntrack_max;优化连接复用/超时;分流出大流量到 RAW/策略路由

四 参数与工具清单

  • 关键内核参数(按需调整,建议逐步变更并压测验证)
    • 接收缓冲与队列:net.core.rmem_max/rmem_default、net.core.wmem_max/wmem_default、net.core.netdev_max_backlog、net.core.netdev_budget
    • TCP 队列与特性:net.ipv4.tcp_max_syn_backlog、net.core.somaxconn、net.ipv4.tcp_tw_reuse、net.ipv4.tcp_tw_recycle(NAT 场景禁用)、net.ipv4.tcp_max_tw_buckets
    • 策略与校验:net.ipv4.conf.all.rp_filter、net.ipv4.conf.all.log_martians、net.netfilter.nf_conntrack_max
  • 常用工具与命令
    • 统计与队列:cat /proc/net/dev、ifconfig、ethtool -S <iface>、ethtool -g/-G <iface>、cat /proc/net/softnet_stat
    • 策略与连接:iptables-save、iptables -L -nv、netstat -s、netstat -ant | grep SYN_RECV、dmesg | grep conntrack
    • 抓包与内核追踪:tcpdump -i <iface> ...、dropwatch、bpftrace

五 实践建议

  • 先定位后优化:以指标(如 fifo、dropped、SYN_RECV)为准,确认“哪一环”在丢包,再决定是调 Ring Buffer、backlog、队列还是应用/策略。
  • 变更可控:一次只调整少量参数,变更前后保留基线数据(如 sar -n DEV 1 60、/proc/net/dev 快照),并回滚异常变更。
  • 面向场景:短连接高并发侧重队列与 conntrack;大流量长连接侧重 Ring Buffer、软中断与 RSS 亲和;跨 NAT 场景避免 tcp_tw_recycle。
  • 端到端视角:同时核查对端设备(交换机/路由器)端口、速率/双工、流控与 MTU,避免“一端优化、另一端瓶颈”。

0 踩