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

当执行 ss -tni 后,看到类似 timer:(on,15sec,0) 的输出,很多人可能会错误地认为这意味着“该连接已经存在了15秒”。但实际上,它仅仅表示某个内核定时器(比如keepalive或retransmit)处于激活状态,并且剩余时间约为15秒,这并不能反映连接从 SYN_SENT 到 ESTABLISHED 的真实建立耗时。因为内核根本不会向用户空间暴露连接建立的精确时间戳,ss 也没有对应的字段。
如果你实际想测的是「HTTP 请求中 TCP 连接建立花了多久」,curl -w 是最直接可用的方案:
-o /dev/null -s 必须加,否则响应体或进度条会污染输出%{time_connect} 表示从请求发起 → TCP 连接成功(三次握手完成),单位秒,精度纳秒级%{time_namelookup} 是 DNS 耗时,%{time_connect} - %{time_namelookup} 才是纯 TCP 建连时间%{time_appconnect} 观察 TLS 握手是否拖慢建连示例命令:curl -o /dev/null -s -w "DNS:%{time_namelookup}nTCP:%{time_connect}n" https://example.com
对非 HTTP 场景(如 Redis、MySQL 直连),curl 不适用,需绕过应用层:
time nc -zv host port 可粗略测单次建连,但 time 统计含进程启动开销,误差常达 10–50msconnect() 前后用 clock_gettime(CLOCK_MONOTONIC, ...) 计时SO_REUSEADDR,防止 TIME-WAIT 干扰下面是一段Python示例代码:
import socket, time
s = socket.socket()
start = time.monotonic()
s.connect(('example.com', 443))
print(f"连接耗时{(time.monotonic() - start)*1000:.2f}毫秒")
如果大量连接建连慢,往往不是单次耗时高,而是服务端资源瓶颈:
top 观察 %sy 是否持续 >30%,说明内核协议栈处理压力大ss -lnt 查看监听端口的 Recv-Q(全连接队列)和 Send-Q(半连接队列),非零且持续增长即表明队列溢出net.core.somaxconn(全队列上限)、net.ipv4.tcp_max_syn_backlog(半队列上限)是否足够真正耗时的从来不是单次 connect 系统调用本身,而是它在内核里排队等待被 accept 的那几百毫秒——这点最容易被忽略。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9