Linux dropped技术探讨
导读:Linux dropped 技术探讨 一 概念与分层定位 在 Linux 网络栈中,dropped 表示数据包在接收路径上被内核或驱动“有意丢弃”,不等同于物理层错误。常见计数含义: RX errors:总错误数(如 CRC、frame...
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 等物理层计数。
- 查看 Ring Buffer 与是否溢出:
- 第三步 内核网络栈队列
- 软中断与 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>。
- 软中断与 backlog 队列:
- 第四步 协议栈与策略
- 连接队列:半连接队列(
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,避免“一端优化、另一端瓶颈”。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux dropped技术探讨
本文地址: https://pptw.com/jishu/758852.html
