全连接队列实际长度由min(backlog, net.core.somaxconn)决定,必须同步调大二者并配套优化TCP全链路参数;否则仅调高backlog无效,队列仍会溢出导致静默丢包和延迟放大。
调整 listen 指令的 backlog 参数本身不能直接“扩大完全连接队列容量”,它只是向内核传递一个建议值;真正起决定作用的是该值与系统参数 net.core.somaxconn 的较小者。响应时间尖峰往往源于握手完成但尚未被 accept() 取走的连接在队列中积压,甚至被内核静默丢弃后客户端重试,造成延迟放大。关键在于让全连接队列(accept queue)能稳住突发流量,为事件循环争取处理时间。
三次握手完成后(即状态变为 ESTABLISHED),连接才进入全连接队列,等待应用调用 accept()。这个队列长度就是 backlog 所影响的部分。它和半连接队列(SYN_RECV 状态)是分开管理的,后者由 net.ipv4.tcp_max_syn_backlog 控制。所以想缓解安全接入路径下的尖峰,必须先确认瓶颈在哪个队列——如果大量连接卡在 SYN_RECV,调大 backlog 无效。
Linux 内核会截断:实际全连接队列长度 = min(backlog, net.core.somaxconn)。若只在 Nginx 或 Redis 配置里写 backlog=4096,而 somaxconn 仍为默认 128,则队列实际最多存 128 个连接。
sudo sysctl -w net.core.somaxconn=65535
/etc/sysctl.conf 中添加 net.core.somaxconn = 65535,再运行 sysctl -p
cat /proc/sys/net/core/somaxconn
光有大的队列只是缓冲,最终取决于事件循环能否及时“取货”:
listen 443 ssl backlog=65535;;Redis 设 tcp-backlog 65535;Go 默认仅 50,需显式设置accept() 直到返回 EAGAIN,避免一次只取一个连接/proc/net/snmp 中的 SynsToListenDrops(半连接丢弃)和 ListenOverflows(全连接队列溢出),两者上升都说明对应队列已满HTTPS/TLS 接入路径天然更长:TCP 握手 + TLS 握手 + 客户端证书校验等,导致 accept() 到首字节读取之间延迟更高,更容易积压。此时:
backlog 和 somaxconn 设为 65535(或至少 16384),尤其在 WAF、API 网关、mTLS 入口等节点--sysctl 显式透传 net.core.somaxconn,宿主机设置对容器内进程无效net.ipv4.tcp_tw_reuse = 1 和扩宽 ip_local_port_range,缓解短连接场景下端口耗尽引发的间接延迟Mixed-Media Kitchen Cooking Animation
Fluid Sketch Martial Arts Battle
Epic Kung Fu Duel on Bioluminescent Lake
Amusement Park Time Stop Cinematic
Pixar Style Mango Juice Making Video
Anime Fashion Short on Route 66