Linux dropped 的定位与规避清单
一、先快速定位 dropped 来自哪一层
- 接口层计数:用 ip 与 ethtool 看硬件/驱动层是否丢包
- 查看接口统计:ip -s link show dev eth0(关注 RX dropped、RX errors、RX overruns)
- 查看驱动/硬件计数:ethtool -S eth0 | egrep -i ‘drop|err|rx_.*no|fifo’(关注 rx_fifo_errors、rx_no_buffer、rx_missed_errors)
- 查看环形缓冲:ethtool -g eth0(当前/最大 RX/TX ring)
- 查看协议栈丢弃:nstat -az | egrep ‘IpInDiscard|UdpInErrors’
- 查看软中断/队列:cat /proc/softnet_stat(第2列为因 netdev_max_backlog 溢出丢弃的包,按 CPU 核展示)
- 路径 MTU:tracepath -n 目标;ping -M do -s 1472 目标(验证是否 PMTU 黑洞)
以上能快速判断是“网卡 Ring Buffer/驱动”“内核 backlog/软中断”“协议栈/应用”还是“MTU 路径”导致的 dropped。
二、常见根因与对应处置
- 网卡 Ring Buffer 溢出(RX fifo/overruns 增长)
- 现象:ethtool -S 中 rx_fifo_errors/rx_overruns 或 ip -s 的 RX overruns 增长;ethtool -g 显示 ring 较小。
- 处置:适当增大 RX ring(ethtool -G eth0 rx 4096),并确保中断/软中断能及时处理(见第四节 CPU 亲和与多队列)。
- 内核 backlog 队列溢出(/proc/softnet_stat 第2列增长)
- 现象:软中断处理不及时或并发过高导致 netdev_max_backlog 被占满。
- 处置:提升内核网络队列与软中断处理能力(见第四节),并优化应用消费速度。
- 半连接/全连接队列溢出(SYN 洪泛、accept 不及时)
- 现象:ss -lnt 看到 Recv-Q 堆积;nstat 出现 TcpExtListenOverflows。
- 处置:增大 somaxconn、tcp_max_syn_backlog,应用及时 accept,必要时启用 syn proxy/限流。
- MTU/分片问题(PMTU 黑洞)
- 现象:大包全丢、小包正常;tracepath/ping 显示 pmtu 异常。
- 处置:统一端到端 MTU,开启或修复 Path MTU Discovery,必要时调小 MSS。
- 物理层/协商问题(CRC、错帧、双工/速率不匹配)
- 现象:ethtool -S 中 crc_errors、frame_errors 增长;ethtool 显示速率/双工异常。
- 处置:重插/更换网线,核对对端协商(ethtool -r eth0;必要时 ethtool -s speed 1000 duplex full autoneg off)。
- 流控与上下游配合
- 现象:ethtool -S 中 rx_flow_control_xon/xoff 异常波动。
- 处置:在明确上下游能力的前提下统一开启/关闭流控,避免拥塞时被动丢包放大。
以上根因与处置覆盖了最常见的 dropped 场景,可逐项对照排查与修复。
三、面向高速网络的预防调优(10Gbps 场景也适用)
- 多队列与 RSS:让网卡并行收包
- 检查/设置队列数:ethtool -l eth0;ethtool -L eth0 rx N 或 combined N;
- 合理哈希:ethtool -n/-N eth0 rx-flow-hash 确保按四元组均衡。
- 中断亲和性与 RPS/RFS:把软中断摊到更多核
- 将每个队列的 IRQ 绑定到不同 CPU(/proc/irq//smp_affinity_list);
- 硬件队列不足时用 RPS/RFS 软件分发(rx-*/rps_cpus、rps_flow_cnt)。
- 套接字与协议栈缓冲区:按带宽时延积(BDP)配置
- 增大最大/动态范围:net.core.rmem_max/wmem_max;net.ipv4.tcp_rmem/tcp_wmem;
- 队列与连接:net.core.somaxconn、net.ipv4.tcp_max_syn_backlog;
- 拥塞控制:启用 bbr(net.ipv4.tcp_congestion_control=bbr),配合 SACK/DSACK、RACK、initcwnd 等加速收敛。
- 软中断与 CPU 压力治理:避免单核打满
- 监控 /proc/interrupts 与 /proc/softirqs,必要时结合 irqbalance/亲和性优化。
这些手段从“硬件并行—中断分布—内存缓冲—协议栈行为”全链路提升承载能力,显著降低 dropped 概率。
四、最小改动的一键式检查与修复脚本
- 快速巡检(只读,定位问题优先)
- ip -s link show dev eth0
- ethtool -S eth0 | egrep -i ‘drop|err|rx_.*no|fifo’
- ethtool -g eth0
- cat /proc/softnet_stat | head -n $(nproc)
- nstat -az | egrep ‘IpInDiscard|UdpInErrors|TcpExtListenOverflows’
- tracepath -n 8.8.8.8;ping -M do -s 1472 8.8.8.8
- 低风险修复(确认瓶颈后再执行,变更前备份)
- 增大 RX ring:ethtool -G eth0 rx 4096(视网卡与内存而定)
- 队列与连接:echo ‘net.core.somaxconn = 32768’ >>/etc/sysctl.d/99-net.conf;echo ‘net.ipv4.tcp_max_syn_backlog = 32768’ >>/etc/sysctl.d/99-net.conf
- 应用侧:提升进程并发、加速消费、开启 GRO/LRO 与 RPS(仅在确认瓶颈后再启用)
以上命令覆盖“看哪里、怎么判、改哪里”的最小闭环,建议先在测试环境验证再上线。