Linux dropped案例分析
导读:Linux dropped 案例分析精选 案例一 UDP 大流量下接收端 dropped 与 overruns 并存 现象:使用 iperf3 udp 打流时,接收端吞吐仅 600+ Mbps,出现 rx error 与 overruns...
Linux dropped 案例分析精选
案例一 UDP 大流量下接收端 dropped 与 overruns 并存
- 现象:使用 iperf3 udp 打流时,接收端吞吐仅 600+ Mbps,出现 rx error 与 overruns 增长,设定 1000 Mbps/5 s 未达成。
- 初步定位:
- 发送端 ifconfig 无错误;接收端 ifconfig 显示 RX errors 与 overruns 增长。
- UDP 统计中 InErrors 与 RcvbufErrors 近似相等,指向接收端缓存/缓冲不足。
- 深入辨析:
- RX errors:总接收错误(过长帧、CRC、帧对齐等)。
- RX dropped:已进入驱动/协议栈但因资源不足等原因未进一步处理(如 socket buffer 不足)。
- RX overruns/fifo:网卡侧 Ring Buffer 或 NIC 内部 FIFO 来不及消费被丢弃,常在 /proc/net/dev 的 fifo 字段或 ifconfig 的 overruns 体现。
- 处置与效果:
- 调大 Ring Buffer(ethtool -G rx/tx),效果有限甚至劣化(CPU/中断处理跟不上时放大排队并不能治本)。
- 调大 socket buffer(如 rmem_default/rmem_max),有明显改善但仍有丢包。
- 将网卡中断分散到多核(设置 smp_affinity,并停用或排除 irqbalance 干扰),丢包消失、吞吐恢复。
- 要点:多核负载不均导致软中断拥塞时,单纯加大缓存往往收益有限,需结合中断亲和与 RPS/RFS 等手段做整体调优。
案例二 半连接队列溢出导致 TCP 新连接被丢弃
- 现象:高并发短连接时,部分客户端 SYN 不响应,服务端日志/内核提示新 SYN 被丢弃。
- 定位方法:
- 内核日志检索:dmesg | grep “TCP: drop open request from”。
- 连接状态统计:netstat -ant | grep SYN_RECV | wc -l,若数值异常偏大,疑似 SYN Flood 或 tcp_max_syn_backlog 过小。
- 处置建议:
- 临时放大 net.ipv4.tcp_max_syn_backlog 与 net.core.somaxconn,并结合业务压测确定合理值。
- 启用 syncookies(net.ipv4.tcp_syncookies=1)缓解洪泛冲击。
- 结合防火墙/清洗设备做流量治理,避免应用层被压垮。
- 要点:SYN 丢弃多发生在握手早期队列阶段,优先核查队列容量与连接洪泛特征。
案例三 iptables 与连接跟踪导致的丢包
- 现象:访问间歇性失败或时延抖动,应用日志无明显错误,但服务不稳定。
- 排查路径:
- 规则面:
- 列出 DROP/REJECT 规则:iptables-save | grep -i drop;
- 观察命中计数:iptables -L INPUT -nv,若某条 DROP 规则 pkts 持续增长,即为可疑点。
- 内核面:
- 追踪内核丢包点:perf record -g -a -e skb:kfree_skb & & perf script;
- 或用 dropwatch 观察丢包栈:dropwatch -l kas(如频繁出现在 nf_hook_slow,多为 Netfilter 丢包)。
- 连接跟踪:
- 检查是否 conntrack 表满:对比 nf_conntrack_count 与 nf_conntrack_max;
- 若接近上限,适当提升 net.netfilter.nf_conntrack_max 并优化长连接/短连接生命周期。
- 规则面:
- 处置建议:清理无效规则、合并冗余规则、对大流量场景合理调大 conntrack 上限并启用分片/尽早释放策略。
- 要点:防火墙与连接跟踪是常见“静默丢包”来源,需同时核查规则命中与内核丢包栈。
案例四 MTU 配置错误引发“能握手但收不到数据”
- 现象:hping3 -S 三次握手正常,但 curl 访问超时;抓包可见握手成功但后续数据不见。
- 定位过程:
- 接口统计:netstat -i 显示 RX-DRP 增长;
- 发现接口 MTU=100(异常偏小,以太网通常为 1500);
- 将 MTU 调回 1500 后,HTTP 访问恢复正常。
- 成因解释:握手报文小可过,但携带数据的报文因 DF 或路径 MTU 限制被丢弃/无法分片,导致“看似通、实不通”。
- 要点:遇到“握手 OK 但数据不通”,优先核查 MTU、DF 标志与路径 PMTU 设置。
案例五 硬件与驱动层问题导致 dropped
- 典型诱因与排查:
- 速率/双工协商异常:ethtool 查看;必要时 ethtool -r 重协商,或强制设置 speed/duplex/autoneg。
- 流控(Pause)异常:
- 统计:ethtool -S | grep control(观察 rx_flow_control_xon/off);
- 配置:ethtool -A rx off tx off(按需关闭/开启)。
- 物理层错误:ethtool -S | grep crc_errors,优先排查网线、光模块、端口接触与规格匹配。
- 报文长度错误:ethtool -S | grep length_errors,核对 MTU 与巨帧支持。
- Ring Buffer 溢出:/proc/net/dev 的 fifo 增长或 ethtool -S 中 rx_fifo_errors,可调 ethtool -G 增大环形缓冲并配合中断亲和/多队列优化。
- 要点:硬件/驱动侧问题往往伴随 CRC/长度/协商/流控 等计数异常,先硬件后软件、由外而内逐层确认。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux dropped案例分析
本文地址: https://pptw.com/jishu/758854.html
