curl -o /dev/null -s -w 'connect=%{time_connect} total=%{time_total}\n' http://api.local/health
sysctl net.ipv4.tcp_keepalive_time

同一个接口,短连接压测 TPS 1800,平均 220 毫秒;打开 keep-alive 后 TPS 5600,平均 85 毫秒。抓包里短连接每次都要三次握手加 TLS。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:短连接模式每个请求新建连接,握手和 TLS 协商的成本都算在响应时间里。服务端的连接建立也有开销,短连接下大量时间耗在 accept 上。真实用户走的是浏览器连接复用,短连接结果和线上不是一个场景。

「keep-alive 压测」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:脚本里打开 Use KeepAlive 并设置连接超时;确认服务端的 keepalive_timeout 大于压测间隔;长连接下观察 TIME_WAIT 是否明显下降;两种模式各跑一轮 把差异写进报告。

确认没问题再收工,长连接模式下 TPS 稳定在 5000 以上,握手耗时不再计入响应时间。

作者 9823189