Linux dropped如何避免
导读:Linux dropped 丢包的成因与规避 一 快速定位思路 明确丢包位置:链路/对端、网卡硬件队列、内核网络栈、连接队列、应用缓冲区。 基础巡检: 端到端连通与路径:ping、traceroute 检查丢包率与跳点异常。 接口与地址...
Linux dropped 丢包的成因与规避
一 快速定位思路
- 明确丢包位置:链路/对端、网卡硬件队列、内核网络栈、连接队列、应用缓冲区。
- 基础巡检:
- 端到端连通与路径:ping、traceroute 检查丢包率与跳点异常。
- 接口与地址:ip a、route -n 检查 IP/掩码/网关/路由 是否正确。
- 协商与驱动:ethtool 查看 Speed/Duplex/AutoNeg;必要时 ethtool -r 重新协商或固定速率;lspci/驱动版本核查。
- 资源瓶颈:top/vmstat 检查 CPU/内存/带宽/磁盘IO 是否过载。
二 常见原因与对应规避措施
- 网卡 Ring Buffer 溢出(RX fifo/overruns 增长)
- 现象:ifconfig/ethtool -S 中 RX overruns/rx_fifo_errors 持续增加。
- 规避:适当增大网卡 RX/TX ring;优化中断与 RPS/XPS 亲和;必要时固定端口速率/双工,排查对端与链路质量。
- 参考:ethtool -g 查看;ethtool -G rx 4096 tx 4096 调整;检查中断分布与 CPU 负载。
- 内核网络栈 backlog 溢出(softnet backlog)
- 现象:/proc/net/softnet_stat 某 CPU 行第 2 列 增长(netdev backlog 溢出)。
- 规避:提升 net.core.netdev_max_backlog;加速软中断处理(RPS/XPS、中断亲和、减少 CPU 软中断瓶颈)。
- TCP 连接队列溢出(SYN 或 accept 队列)
- 现象:netstat -s | grep -i listen 出现 SYNs to LISTEN sockets dropped 或 “listen queue overflowed”;ss -lnt 中 Recv-Q 长期接近 Send-Q。
- 规避:增大 net.ipv4.tcp_max_syn_backlog 与 net.core.somaxconn;应用合理设置 listen(backlog);必要时开启 net.ipv4.tcp_abort_on_overflow。
- 反向路由过滤 rp_filter 误丢
- 现象:严格/松散模式导致入包源地址不可达而被丢弃。
- 规避:依据拓扑设置 rp_filter=2(松散) 或 0(关闭);确保入包的反向路径可达。
- 连接跟踪表 nf_conntrack 满
- 现象:dmesg/日志出现 nf_conntrack: table full, dropping packet。
- 规避:增大 nf_conntrack_max 与 hashsize;缩短 nf_conntrack_tcp_timeout_established;优化连接复用/减少短连接;必要时分流出大流量或关闭连接跟踪(仅限明确安全边界)。
- ARP 表溢出
- 现象:dmesg 出现 neighbor table overflow;cat /proc/net/stat/arp_cache 的 table_fulls 增长。
- 规避:提升 net.ipv4.neigh.default.gc_thresh1/2/3(如 1024/2048/4096);核查异常 ARP 洪泛与二层拓扑。
- MTU/分片重组问题
- 现象:netstat -s 中 fragments dropped after timeout 或重组失败计数增长。
- 规避:统一 MTU;必要时调整 net.ipv4.ipfrag_time 与分片相关内存阈值。
三 关键参数与命令清单
- 建议先基线采集:ifconfig 、ethtool -S 、cat /proc/net/dev、cat /proc/net/softnet_stat、ss -lnt、netstat -s、ip a、route -n、ping/traceroute。
- 常用调优示例(按场景按需调整,变更前评估与灰度):
- 网卡 Ring Buffer:ethtool -g ;ethtool -G rx 4096 tx 4096
- 软中断与 backlog:sysctl -w net.core.netdev_max_backlog=2000(结合 CPU/负载评估)
- TCP 队列:sysctl -w net.core.somaxconn=4096;sysctl -w net.ipv4.tcp_max_syn_backlog=4096;sysctl -w net.ipv4.tcp_abort_on_overflow=1
- 反向路由过滤:sysctl -w net.ipv4.conf.all.rp_filter=2;或针对接口 sysctl -w net.ipv4.conf..rp_filter=2
- 连接跟踪:sysctl -w net.netfilter.nf_conntrack_max=1048576;sysctl -w net.netfilter.nf_conntrack_buckets=262144;sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=600
- ARP:sysctl -w net.ipv4.neigh.default.gc_thresh1=1024;sysctl -w net.ipv4.neigh.default.gc_thresh2=2048;sysctl -w net.ipv4.neigh.default.gc_thresh3=4096
- 分片重组:sysctl -w net.ipv4.ipfrag_time=60
- 变更原则:小步调整、持续观测(丢包计数、RTT、CPU 软中断、应用错误率),并做好回滚预案。
四 应用层与架构侧的规避
- 控制发送速率与突发:UDP/ICMP 无内置流控,应用需限速/令牌桶,避免瞬时突发压满 socket 发送缓冲与网卡队列。
- 合理设置 socket 缓冲:为长肥管道(高 BDP)增大 SO_RCVBUF/SO_SNDBUF;系统层面可调整 net.core.rmem_default/wmem_default、rmem_max/wmem_max,并结合 BDP=带宽×RTT 估算所需缓冲规模。
- 减少短连接与握手风暴:启用长连接/连接池/HTTP keepalive;优化服务并发与 accept 能力,避免 accept 队列长期打满。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux dropped如何避免
本文地址: https://pptw.com/jishu/763434.html
