Linux dropped 提升系统稳定性的实用指南
一、先快速定位丢包位置
- 端到端健康:用 ping 测时延与丢包,用 mtr -ezbw -c 100 目标 持续观察每一跳的丢包与时延,判断是端点问题还是中间路径问题。若只有中间节点丢包而末端为 0%,常见为中间设备对 ICMP 限速,不一定是真实业务丢包。
- 本机是否丢包:用 ip -s link show dev eth0 查看 RX dropped 是否持续增长;用 *ethtool -S eth0 | egrep -i 'drop|err|rx_.no|fifo’ 看是否有 rx_no_buffer / rx_fifo_errors 等计数增长,指向 Ring Buffer 或驱动层问题。
- 协议栈与重传:用 ss -ti ‘( dport = :443 or sport = :443 )’ 观察 rtt / rto / cwnd / retrans,若 retrans 持续升高,多为链路拥塞或丢包引起。
- 全局计数与设备统计:用 nstat -az | egrep ‘TcpRetransSegs|IpInDiscard|UdpInErrors’ 看全局丢包/重传;用 sar -n DEV,EDEV 1 3 观察 rxdrop/s 是否持续不为 0。
- 路径 MTU:用 tracepath -n 目标 看 pmtu;用 ping -M do -s 1472 目标 验证分片能力,若大包不通而小包通,警惕 PMTUD 黑洞。
二、常见根因与对应修复
- 硬件与驱动
- 检查协商与链路:用 ethtool eth0 看 Speed/Duplex/Autoneg;异常时尝试 ethtool -r eth0 重新协商,必要时固定速率双工(如 speed 1000 duplex full autoneg off)。
- 扩大 Ring Buffer:用 ethtool -g eth0 查看最大/当前值,必要时 ethtool -G eth0 rx 4096 tx 4096 提升突发吸收能力。
- 驱动与固件:用 ethtool -i eth0、lspci -v 确认驱动版本与设备型号,异常时升级驱动/固件或重启网卡服务。
- 配置与路径
- 基础配置:用 ip a、route -n 校验 IP/掩码/网关/路由表 是否正确;检查 安全组/iptables 是否误拦截。
- MTU/PMTUD:若 ping -M do -s 1472 失败而小包正常,说明存在 PMTUD 黑洞,需与对端/中间设备协同开启 ICMP Fragmentation Needed 或调小 MTU。
- 资源与队列
- 资源瓶颈:用 top 检查 CPU/内存/带宽,高占用会导致网络线程处理不及时;必要时扩容规格或优化业务。
- 队列与缓冲:结合 ethtool -S 与 ip -s link 判断 RX dropped 是否由 Ring Buffer/软中断 不及引起,适度增大 Ring Buffer 并优化软中断分布(如 RPS/RFS、中断绑核)。
- 业务与协议
- 连接风暴/半开连接:用 ss -s 观察 SYN_RECV/TIME_WAIT 堆积,优化应用并发与超时/重试策略。
- TCP 重传:若 ss -ti 显示 retrans 持续升高,优先排除链路拥塞与丢包,再考虑调整 tcp_retries2 / tcp_syn_retries 等参数。
三、关键 sysctl 参数与建议值
- 增大套接字缓冲(按内存与并发调优,先测后设)
- net.core.rmem_max = 16777216
- net.core.wmem_max = 16777216
- net.ipv4.tcp_rmem = 4096 87380 16777216
- net.ipv4.tcp_wmem = 4096 65536 16777216
- 加速回收与降低端口压力
- net.ipv4.tcp_fin_timeout = 30
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_tw_recycle = 0(NAT/云环境易出问题,建议关闭)
- net.ipv4.tcp_max_syn_backlog = 4096
- net.core.somaxconn = 4096
- 拥塞控制与快速恢复
- net.ipv4.tcp_congestion_control = bbr(或 cubic,按业务与链路实测选择)
- net.ipv4.tcp_slow_start_after_idle = 0
- 生效方式
- 写入 /etc/sysctl.conf 或 /etc/sysctl.d/99-network.conf,执行 sysctl -p 生效。
- 说明
- 缓冲区过大可能加剧 Bufferbloat,建议结合 qdisc/fq_codel 或带宽控制策略联合调优。
四、监控与长期稳定性
- 持续观测
- 基线指标:rxdrop/s、txdrop/s、retrans、rtt、cwnd、ifutil(带宽占用)。
- 工具组合:nstat -az(计数)、sar -n DEV/EDEV(设备)、ss -ti(连接/重传)、mtr(路径)、ip -s link(接口统计)。
- 告警阈值(示例)
- rxdrop/s > 0 持续 5 分钟、retrans 持续上升、平均 RTT 突增 > 2×基线、ifutil > 70% 持续 10 分钟。
- 变更与回滚
- 参数/驱动/固件/拓扑变更前先建立基线,变更后按阈值观察,异常及时回滚并保留 tcpdump/wireshark 证据。
五、一键排查清单(可直接执行)
- 端到端与路径
- ping -c 20 目标;mtr -ezbw -c 100 目标;tracepath -n 目标
- 本机接口与驱动
- ip -s link show dev eth0;ethtool -S eth0 | egrep -i ‘drop|err|rx_.*no|fifo’;ethtool -g eth0;ethtool -i eth0;lspci -v | grep -i ether -A 10
- 协议栈与连接
- ss -ti ‘( dport = :443 or sport = :443 )’ | head -n 20;nstat -az | egrep ‘TcpRetransSegs|IpInDiscard|UdpInErrors’;sar -n DEV,EDEV 1 10
- 配置与安全
- ip a;route -n;iptables -L -n -v;systemctl list-units | grep network;dmesg | grep -i eth0
- MTU 验证
- ping -M do -s 1472 目标(逐步增减大小定位 PMTUD 问题)