3.5 秒的固定延迟问题

一天工作日,你拿着刚买的咖啡来到了办公室,准备开始做计划好的工作,度过本该是平平无奇的一天,直到——一位用户发过来消息说他们有新的机器上线之后,所有的 TCP 连接都自带3.5s左右的延迟!他们的服务在使用新的服务器之后,延迟都上升了 3.5s!

经过他们自己的 debug,他们发现,延迟增加之后,在 TCP 连接建立之后,有3.5s 的时间没有发送数据,之后,网络就正常了!然后我们知道,不光服务器是新的,机架,网络设备,都是新的。这批服务器本不该你来负责,但是这个现象也太怪了!所有人都知道你是公司里的网络专家,如果有有解决不了的网络问题,就会来找你。

你让用户用 iperf 测试一下带宽1,用户测试了一下,结果如下:

还真是和用户说的一样!

这必须要抓包一下才知道原因了!用户又做了一次 iperf,并且同时执行 tcpdump 进行抓包,过一会儿,就发来了抓包文件。

你看了一会,然后马上就发现了不对劲的地方……

请分析这个抓包文件,找出固定3.5s延迟的问题在哪里。

  1. https://iperf.fr/ ↩︎


3.5 秒的固定延迟问题”已经有8条评论

  1. 直接丢给gemini,你的提问。作为提示词:
    延迟原因定位
    ​这种“阶梯式”的延迟(1s + 2s + …)是典型的 TCP 指数退避 (Exponential Backoff) 机制。
    ​根本原因:
    ​网络丢包:中间网络设备或防火墙丢弃了前几次 SYN 包。
    ​服务端监听队列溢出:服务端的 backlog 队列已满,导致它忽略了新的 SYN 请求。
    ​防火墙/安全策略:某些安全设备可能对高频连接有拦截,或者在特定的“静默期”后才放行流量。
    ​建议解决方案
    ​检查服务端资源:查看服务端(10.x.x.x)的 CPU 负载和网络连接数,确认是否存在 SYN Flood 防护被触发的情况。
    ​检查防火墙日志:排查中间路径上的防火墙或负载均衡器,看是否有针对该端口的丢弃记录。
    ​内核参数优化:如果是 Linux 服务器,可以尝试调小 tcp_syn_retries 或检查 net.core.somaxconn 队列深度。
    ​这个 3.5 秒的延迟并非应用层的处理缓慢,而是典型的网络层/传输层建连重试导致的启动延迟。

    • 如果 MTU 设置错误,而且收不到 ICMP 提示 segment 太大的话 (现实情况一般是收不到的)就会出现 blackhole,默认情况是会一直卡住的。

      但是可以通过 sysctl 设置 net.ipv4.tcp_mtu_probing,默认是 0,如果是 1 的话,在出现 blackhole 的时候就会尝试降低 segment 的大小看能不能通。

Leave a comment

您的邮箱地址不会被公开。 必填项已用 * 标注