连载中 16/20

长连接复用:握手与慢启动的成本摊薄手册

2026-10-08 · 13 阅读 · 0 评论 · 0 赞

先把成本账算清

一次全新的 HTTPS 请求 vs 复用连接,差距全在首字节之前:

短连接(每次请求新建):
  TCP 握手 1 RTT + TLS1.3 1 RTT + 请求 1 RTT ≈ 3 RTT 起步
  外加:慢启动从 10 MSS 重新爬、服务端 accept 压力、TIME_WAIT 堆积

复用连接(keepalive):
  0 RTT 建连开销,cwnd 已在高位,直接全速传输

// RTT 50ms、QPS 1000 的场景:
// 短连接每天白烧 50ms × 8640 万次握手 —— 50 天的纯等待
// 这就是为什么所有高性能组件都是长连接

keepalive 必须全链路打通

很多人开了浏览器到 Nginx 的 keepalive 就以为完事了——Nginx 到后端应用默认每请求新开一条连接,最贵的一段(应用 accept、FD)根本没省到:

upstream app_server {
    server 10.0.0.1:8080;
    keepalive 64;              ← upstream 连接池:每 worker 缓存 64 条空闲连接
}
server {
    location / {
        proxy_http_version 1.1;                    ← 必须 1.1 才有 keepalive
        proxy_set_header Connection "";            ← 清掉 close,允许复用
        proxy_pass http://app_server;
    }
}
# 三处缺一不可:keepalive 池、http_version 1.1、清 Connection 头
# 效果:Nginx→应用 的 TIME_WAIT 直接消失,应用 QPS 上限抬升

同理还有数据库连接池(HikariCP、Druid)、RPC 长连接(Dubbo、gRPC)、Redis 客户端池——凡是“每次调用新建连接”的写法,在高 QPS 下都会先撞 FD 上限,再撞端口耗尽。

连接池参数:三个数定生死

参数含义踩坑点
maxSize池上限DB 侧 max_connections 被多实例瓜分
minIdle常驻下限流量突刺时来不及建连接
maxWait借不到等多久设无限等 = 池耗尽时全线雪崩
idleTimeout空闲多久回收必须小于服务端/中间件的空闲断开时间

最后一行是经典事故来源:池里一条连接空闲太久,被中间的 LB 或数据库悄悄关了,业务拿来就用,偶发 connection reset。解法是让 idleTimeout 比链路上最短的空闲超时更短,或开借出前探活。

TCP keepalive ≠ HTTP keepalive

两个名字一样的东西完全是两回事:HTTP keepalive 是应用层约定“连接用完别关”;TCP keepalive 是内核的保活探针——连接空闲超过 tcp_keepalive_time(默认 7200 秒)才发探测包,判断对端死没死。真正负责空闲连接回收的是应用层的 idle timeout(Nginx keepalive_timeout、连接池 idleTimeout、网关的 60 秒)。IM、推送这类长连接还要靠应用层心跳(mqtt ping、websocket ping/pong),别指望 TCP 探针救你。下一篇进入实战段:tcpdump——线上网络问题,抓包见真章。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#长连接#keepalive#连接池#upstream#空闲超时

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10114 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9877 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9307 阅读 · 21 评论 · 287 赞