ListenBacklog是Apache的内核accept队列上限,非Java参数;它控制三次握手完成后等待accept的连接数,需与net.core.somaxconn、Tomcat accept-count等协同调优以避免高并发丢连。

ListenBacklog 不是 Java 参数,而是 Apache 的内核队列上限
很多人搜“Java 高并发 ListenBacklog”,结果配错地方——ListenBacklog 是 Apache HTTP Server 自身的配置项,不属于 JVM 或任何 Java 框架。它控制的是操作系统内核为 Apache 监听套接字维护的“已完成连接队列”(accept queue)长度,即三次握手完成后、等待 Apache 调用 accept() 取走的 ESTABLISHED 连接数。Java 应用只是后端服务,只有当前端 Apache 作为反向代理时,这个参数才间接卡住 Java 的入口吞吐。
为什么默认值 511 在突发流量下会丢连接
Linux 默认 net.core.somaxconn 通常是 511,Apache 若未显式设置 ListenBacklog,就继承该值。高并发场景下容易出问题:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 客户端发完 SYN-ACK 后的 ACK 到达时,accept queue 已满 → 内核直接丢弃 ACK,不返回 RST
- 客户端表现为 “Connection timeout” 或反复重发 SYN(抓包可见),不是 502/504,日志里也难定位
-
ss -lnt显示对应端口的Recv-Q长期接近 511,说明队列持续打满 - Java 应用监控一切正常,但 Apache access.log 的 QPS 明显低于上游负载生成器的请求速率
正确设置 ListenBacklog 的三步实操
不能只改 Apache 配置,必须系统级协同:
- 先调高系统限制:
sudo sysctl -w net.core.somaxconn=65535,并写入/etc/sysctl.conf持久化 - 在 Apache 配置中显式声明 backlog:把
Listen 8080改成Listen 8080 65535(注意语法:地址:端口 后跟数字,中间空格) - 确认 MPM 模式是
event(推荐)或worker;若仍用prefork,需同步调大MaxRequestWorkers,否则 backlog 再大也取不出连接
容易被忽略的关联点
单设 ListenBacklog 不解决问题:
- Tomcat 的
accept-count(Spring Boot 中为server.tomcat.accept-count)应设为相近值,否则连接在 Apache 和 Tomcat 之间“卡住” - 如果用了 php-fpm 或其他 upstream,
pm.max_children也要 ≥ Apache 的并发能力,否则请求堵在应用层前面 -
ulimit -n至少设为 65535,否则 Apache 子进程打开文件描述符失败,error_log里出现unable to create or open stream

















