Linux网络抖动问题分析_链路质量排查说明【指导】

10次阅读

应使用 mtr –tcp -P 443 测真实链路质量,因其可识别每跳 TCP 丢包、重传集中点与延迟突增同步性;本地抖动优先查 ethtool 和 /proc/interrupts;ss - i 与 tcpdump 结合定位内核或应用层问题;警惕 tcp_sack 等配置掩盖真实丢包。

Linux 网络抖动问题分析_链路质量排查说明【指导】

怎么看实时丢包和延迟抖动

直接用 ping 看不准,尤其在高负载或低优先级队列场景下,ICMP 包可能被内核丢弃或延迟调度。真正反映应用层链路质量的是 tcping 或基于真实 TCP 连接的探测。

推荐组合:mtr --tcp -P 443 example.com(持续跟踪每跳的 TCP 丢包与延迟),比单纯 ping 多出三个关键信息:每跳是否真丢包、重传是否集中在某一段、延迟突增是否同步出现。

  • 避免只看首尾两跳 —— 中间运营商设备常开启 ICMP rate-limit,ping 显示“全通”但实际 TCP 流量卡在第 5 跳
  • mtr 默认用 ICMP,加 --tcp 才走真实 端口 路径,否则测的不是业务走的链路
  • 如果 mtr 某跳显示“???”但后续跳正常,大概率是该节点禁 ICMP 回复,不是故障,别误判

怎么查本机 网卡驱动 和队列是否异常

网络抖动常源于本地网卡驱动 bug、RX/TX 队列溢出或中断绑定不均,而不是远端问题。先确认硬件层是否稳定。

执行以下命令快速筛查:

ethtool -S eth0 | grep -E "(drop|overrun|error|reset)" cat /proc/interrupts | grep eth0 cat /sys/class/net/eth0/queues/*/rps_cpus
  • rx_missed_errors 持续增长 → RX ring buffer 溢出,需调大 net.core.rmem_max 或启用 GRO/LRO
  • 同一 CPU 核上 eth0-TxRx- 中断数远高于其他核 → 中断未均衡,用 echo 0f > /sys/class/net/eth0/queues/rx-0/rps_cpus 手动分散(值按实际 CPU mask 调整)
  • tx_aborted_errors 非零且递增 → 物理链路不稳(光纤弯折、模块温度高、对端协商失败),不是软件问题

怎么判断是内核协议 还是应用层导致抖动

抖动出现在建立连接后?还是仅首次 SYN 就超时?用 ss -itcpdump 对比时间戳能快速定位分界点。

例如发现业务请求 RTT 在 20ms~800ms 波动,运行:

ss -i dst 10.0.1.100:8080 tcpdump -i eth0 'host 10.0.1.100 and port 8080' -w debug.pcap -c 1000
  • ss -i 输出中 rtt 值本身波动大 → 内核 TCP 栈已感知链路不稳定(如乱序、重复 ACK 多),重点查 BBR/CUBIC 拥塞控制行为或 net.ipv4.tcp_rmem 设置
  • tcpdump 显示 SYN 重传间隔从 1s → 2s → 4s → 8s → 放弃 → 说明问题在连接建立阶段,和 防火墙 拦截、SYN cookie 触发、或对端 SYN 队列满(net.ipv4.tcp_max_syn_backlog)有关
  • 抓包里看到大量 DUP-ACK 但无重传 → 对端接收窗口卡住,检查对方机器的 ss -i 和内存压力

哪些配置会掩盖真实抖动、让排查变难

很多默认配置会让抖动“看起来不严重”,实则恶化底层问题。比如开启 net.ipv4.tcp_sack 后丢包恢复快,但掩盖了物理层频繁丢包;又比如 net.ipv4.tcp_slow_start_after_idle=0 让长连接持续高速发包,反而压垮中间小带宽节点。

  • net.ipv4.tcp_timestamps=1 开启时,若对端不支持或中间设备篡改时间戳,会导致连接反复重置(tcp_invalid_timestamp 计数上升)
  • net.core.netdev_budget 设为太小(如默认 300)→ 软中断处理不及时,RX 队列堆积,表现为偶发 100ms+ 延迟尖刺
  • 使用 systemd-networkd 时,默认关闭 IPv6 RA 可能导致某些云厂商元数据服务超时重试,间接拉高整体延迟毛刺

抖动问题最麻烦的不是找不到原因,而是多个微小配置叠加后相互干扰 —— 比如 RPS + TSO + GRO 全开时,在特定流量模式下会产生非线性延迟抖动,必须关掉一个再对比测试。

text=ZqhQzanResources