连接计数延迟本质是资源调度瓶颈,需分清SYN队列、全连接队列或keepalive超时导致的空转;用ss -s定位后,针对性调大somaxconn、收紧keepalive_timeout并配置rlimit。

连接计数延迟不是 Nginx 主动“计数慢”,而是连接状态在内核与应用间流转不畅的表现。它本质是资源调度瓶颈,不是统计功能缺陷。关键要分清:是连接建立卡在半路(SYN 队列),还是握手完成却卡在等待 accept(全连接队列),或是连接已建立但空转太久挤占资源。
先确认延迟发生在哪一环
用 ss -s 查看全局 TCP 状态分布:
– 若 SYN-RECV 数量持续偏高(>100),说明客户端发了 SYN,服务端没来得及回复 SYN+ACK,问题在半连接队列;
– 若监听端口的 Recv-Q 接近 Send-Q(如 ss -ltn 输出中 1023/1024),说明三次握手已完成,但应用还没调用 accept(),卡在全连接队列;
– 若大量连接处于 TIME-WAIT 或 ESTABLISHED 但长期无数据交换,大概率是 keepalive_timeout 过长,空闲连接堆积。
针对性调 backlog 和 somaxconn
backlog 控制的是“已握手、未 accept”的连接容量,不是提速工具,目标是避免丢连接:
– 检查当前生效值:sysctl net.core.somaxconn,若小于应用配置(如 Nginx 的 listen 80 backlog=4096),则需调大 somaxconn;
– Web 类服务建议从 2048 起步,压测中 Recv-Q 频繁打满时再逐步加到 4096;
– API 网关类可按公式估算:峰值 QPS × 平均建连耗时(秒),例如 5000 QPS × 0.02s = 100;
– 修改后必须重启对应服务(Nginx、Puma、MySQL 等不支持热更新 backlog 设置)。
收紧 keepalive_timeout 防止连接淤积
过长的 keepalive_timeout 会让空闲连接长期占着文件描述符和内存:
– 默认 65s 对多数场景偏长,API 服务建议设为 30~60s,静态资源可延长至 120~300s;
– 同时配 keepalive_requests 1000,限制单连接最大请求数,防长连接滥用;
– 观察 ss -s | grep time,若 TIME-WAIT 占比超 10%,需配合开启 net.ipv4.tcp_tw_reuse = 1(仅客户端地址可复用)。
别漏掉底层资源限制
再好的参数也跑在系统上:
– 在 /etc/security/limits.conf 中设 * soft nofile 65535 和 * hard nofile 65535,退出重登生效;
– Nginx 配置里加 worker_rlimit_nofile 65535,并确保 worker_connections × worker_processes ≤ rlimit 值;
– 每个连接约消耗 240 字节内存,worker_connections 设太高会吃光内存,4 核机器建议单 worker 不超 8192。


















