listenbacklog实际管控的是全连接队列(accept queue),即三次握手完成、等待apache调用accept()取走的established连接队列,与半连接队列(syn queue)无关;其生效值为min(配置值, net.core.somaxconn),需同步调大系统参数和后端配置才能避免高并发丢连。

ListenBacklog 是 Apache HTTP Server 的核心配置项,它控制操作系统内核为监听套接字维护的“已完成连接队列”(accept queue)长度——即 TCP 三次握手完成(ESTABLISHED 状态)、等待 Apache 主进程或工作线程调用 accept() 取走处理的连接数上限。
ListenBacklog 实际管的是哪条队列?
它只影响全连接队列(accept queue),和半连接队列(SYN queue)无关:
- 客户端发完 SYN → 服务端回 SYN+ACK → 客户端再发 ACK,三次握手才算完成
- 这个 ACK 到达后,连接进入 accept queue,开始排队等 Apache 处理
- ListenBacklog 就是这条队列能容纳的最大连接数
- SYN 队列由内核参数
net.ipv4.tcp_max_syn_backlog控制,不能靠 ListenBacklog 加强
为什么默认值 511 容易出问题?
在突发短连接或后端响应延迟时,Apache 处理不及时,accept 调用跟不上,队列就会打满:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 新完成握手的连接到来,但队列已满 → 内核直接丢弃 ACK(不发 RST)
- 客户端表现为“Connection timeout”或反复重传 SYN,不是 502/504 错误
-
ss -lnt查看对应端口,Recv-Q 长期接近 511,说明队列持续积压 - Java 应用监控正常,但 Apache access.log 的 QPS 明显低于上游请求速率
怎么设才真正生效?
ListenBacklog 不是独立参数,它的实际值取 min(配置值, net.core.somaxconn)。只改 Apache 配置没用:
- 先调大系统级参数:
echo 65535 > /proc/sys/net/core/somaxconn,并写入/etc/sysctl.conf - 再在 Apache 配置中显式设置:
ListenBacklog 65535 - 若用 prefork MPM,需同步增大
MaxRequestWorkers;若用 event/worker,确认ThreadsPerChild和MaxRequestWorkers足够承接 - 后端如 Tomcat 的
server.tomcat.accept-count、php-fpm 的pm.max_children也应 ≥ Apache 并发能力
配套必须检查的几项
光调 ListenBacklog 和 somaxconn 还不够,漏掉这些照样丢连接:
-
ulimit -n至少设为 65535,否则 Apache 子进程打不开足够文件描述符,error_log 出现 “unable to create or open stream” - 检查是否启用了
tcp_syncookies = 1(应对 SYN 洪峰兜底,非性能优化手段) - 避免在高负载下长期阻塞 accept 调用——比如 Apache 后端 Java 响应慢、GC 暂停长、线程池耗尽等,会间接拖垮 accept 队列










