ss -tni 的 timer 字段仅表示内核定时器(如 keepalive 或重传)剩余时间,非连接建立耗时;测 TCP 建连应使用 curl -w %{time_connect}、time + nc 或 socket 程序精确计时,并排查服务端队列积压与内核参数。

Linux怎么查看网络连接建立耗时分布

ss -tni 的 timer 字段不是连接建立耗时

当执行 ss -tni 后,看到类似 timer:(on,15sec,0) 的输出,很多人可能会错误地认为这意味着“该连接已经存在了15秒”。但实际上,它仅仅表示某个内核定时器(比如keepalive或retransmit)处于激活状态,并且剩余时间约为15秒,这并不能反映连接从 SYN_SENTESTABLISHED 的真实建立耗时。因为内核根本不会向用户空间暴露连接建立的精确时间戳,ss 也没有对应的字段。

用 curl -w 测 HTTP 连接各阶段耗时(含 TCP 建连)

如果你实际想测的是「HTTP 请求中 TCP 连接建立花了多久」,curl -w 是最直接可用的方案:

示例命令:
curl -o /dev/null -s -w "DNS:%{time_namelookup}nTCP:%{time_connect}n" https://example.com

测裸 TCP 连接建立耗时:用 time + nc 或自写 socket 程序

对非 HTTP 场景(如 Redis、MySQL 直连),curl 不适用,需绕过应用层:

下面是一段Python示例代码:

import socket, time
s = socket.socket()
start = time.monotonic()
s.connect(('example.com', 443))
print(f"连接耗时{(time.monotonic() - start)*1000:.2f}毫秒")

生产环境排查:看 %sy 和 ss -lnt 是否有队列积压

如果大量连接建连慢,往往不是单次耗时高,而是服务端资源瓶颈:

真正耗时的从来不是单次 connect 系统调用本身,而是它在内核里排队等待被 accept 的那几百毫秒——这点最容易被忽略。

本文转载于:https://www.php.cn/faq/3004649.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。