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

怎么看实时丢包和延迟抖动
直接用 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 -i 和 tcpdump 对比时间戳能快速定位分界点。
例如发现业务请求 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 全开时,在特定流量模式下会产生非线性延迟抖动,必须关掉一个再对比测试。








