Linux 网络延迟升高的常见根因

17次阅读

高延迟但 traceroute 某跳回落,大概率是中间设备禁用 ICMP 而非链路故障;应优先用 hping3 发 TCP SYN 验证真实业务延迟,再排查内核收包队列、TIME-WAIT 堆积或网卡 ring buffer 不足等问题。

Linux 网络延迟升高的常见根因

ping 高延迟但 traceroute 某跳就回落,大概率是中间设备策略限制

很多人看到 ping 延迟高、丢包,第一反应是“网络差”,但真实情况常是 ICMP 被上游 防火墙、运营商设备或云厂商安全组静默丢弃。这不是链路问题,而是协议层拦截。

  • hping3 -c 10 -S -p 80 目标 IP 发 TCP SYN 包,比 ping 更贴近真实业务流量;若延迟正常,说明 ICMP 被限,不用调系统参数
  • traceroute -n -w 2 -q 1 目标 IP 中如果某跳显示 * * * 但下跳又恢复,基本可判定该节点禁 ICMP —— 这不是故障,是配置
  • 别急着改 /proc/sys/net/ipv4/icmp_echo_ignore_all,本机设这个没用,它只控制本机是否响应 ping,不解决外网丢包

内核接收队列溢出(RX queue dropped)导致的“隐形延迟”

延迟突然升高且伴随间歇性丢包,netstat -s | grep "packet receive errors"cat /proc/net/snmp | grep -A1 Tcp 显示大量 TCPRcvQDrop,说明数据包到了网卡却卡在内核收包队列里没被及时取走。

  • 典型诱因:软中断(softirq)集中在单个 CPU 核处理,而应用没及时调用 recv() 或工作线程阻塞
  • 检查命令:cat /proc/interrupts | grep eth0 看各 CPU 上网络中断分布;若只有 CPU0 高,说明 RSS/RPS 未启用或配置失效
  • 临时修复:echo f > /proc/irq/*/smp_affinity_list(绑定到所有核),但长期应配 ethtool -L eth0 combined 4 + 启用 RPS

TIME-WAIT 连接堆积引发 端口 耗尽与连接失败

不是所有高延迟都来自 RTT,有时是客户端发不出新连接——ss -tan state time-wait | wc -l 超过 2~3 万,再看 ss -sorphan 数量飙升,说明连接无法快速释放,新请求排队等待端口。

  • net.ipv4.tcp_tw_reuse = 1 是安全的,但仅对客户端有效(需时间戳开启);服务端请勿依赖它来缓解高并发短连接
  • net.ipv4.tcp_fin_timeout = 30 可缩短 FIN_WAIT_2 时间,但不能低于 30 秒,否则可能丢 ACK
  • 禁用 tcp_tw_recycle:Linux 4.12+ 已移除,旧内核开启后在 NAT 环境下会导致大量连接被拒绝(时间戳反向校验失败)

驱动或 ring buffer 不足引发的底层丢包

Wireshark 抓包发现大量“TCP Retransmission”但服务器 netstat -s 却没报错?很可能丢包发生在网卡 DMA 层——数据还没进内核就被硬件丢弃了。

  • 查丢包位置:ethtool -S eth0 | grep -i "drop|over|error",重点关注 rx_missed_errors(ring buffer 溢出)、rx_over_errors(DMA 缓冲区满)
  • 增大 ring buffer:ethtool -G eth0 rx 4096 tx 4096(值需查网卡支持上限,如 Intel ixgbe 最大 4096)
  • 老旧驱动常见于 Realtek 或某些国产网卡,lspci -k | grep -A3 Ethernet 看 kernel driver 是否为 r8169(建议换 r8168

真正卡住排查节奏的,往往不是参数没调对,而是把应用层慢(比如数据库查询 500ms)当成网络延迟去优化。先跑通 hping3 -Stcpdump 确认协议 是否干净,再动内核参数。

text=ZqhQzanResources