apache http server 不使用 java 线程模型,其 worker mpm 是基于 posix 线程的 c 实现;java 应用中所谓“apache worker”实为 tomcat 等容器的线程池配置,关键参数包括 maxthreads、minsparethreads、maxconnections 和 acceptcount;反向代理场景需分别调优 apache mpm(如 maxrequestworkers、threadsperchild)和后端 tomcat,并关注 cpu、i/o、内存与文件描述符等资源瓶颈。
apache http server 本身不使用 java 线程模型,也不内置“worker 模式”的 java 线程池配置——这是常见误解。所谓 apache 的 worker mpm(multi-processing module)是 c 实现的并发处理模块,它基于操作系统线程(posix threads),与 java 完全无关。如果你在 java 应用中看到 “apache worker” 或 “最大线程数” 配置,大概率是指以下两种情况之一:
你实际用的是 Tomcat(或 Jetty、Undertow),并误称为“Apache Worker”
Tomcat 默认使用 Java NIO 或 Java NIO2 连接器,其线程池由 Executor 控制,而非 Apache MPM。关键配置在 server.xml 中:
- maxThreads:线程池中最大活跃线程数(默认 200),直接决定并发请求上限
- minSpareThreads:空闲时保持的最小线程数(默认 10),影响冷启动响应
- maxConnections:最大连接数(NIO 模式下可远超 maxThreads),受操作系统文件句柄限制
- acceptCount:当所有线程忙碌时,允许排队等待的连接请求数(默认 100),超出则拒绝(Connection refused)
示例配置:
maxConnections="10000" acceptCount="200"/>
你在 Apache HTTP Server 前端反向代理 Java 应用(如 Tomcat),并想调优整体链路
此时需分别优化两端:
-
Apache Worker MPM(
httpd.conf或mpm_worker.conf):-
ServerLimit:最大可配置的
MaxRequestWorkers值(需重启生效) -
MaxRequestWorkers(旧称
MaxClients):同一时刻最大并发连接数,=ThreadsPerChild × MaxConnectionsPerChild的实际上限 - ThreadsPerChild:每个子进程创建的线程数(建议 25–75,避免过高导致上下文切换开销)
- MaxConnectionsPerChild:子进程处理多少请求后重启(防内存泄漏,默认 0 表示永不过期)
-
ServerLimit:最大可配置的
-
后端 Tomcat:确保
maxThreads≥ Apache 的MaxRequestWorkers,否则代理请求会在 Tomcat 队列积压
真实瓶颈往往不在线程数,而在资源约束
盲目调高线程数反而降低性能:
- CPU 密集型任务:线程数超过 CPU 核心数(×1.5~2)会加剧争抢,增加调度开销
- I/O 密集型任务(如数据库调用、远程 HTTP):需结合连接池(HikariCP、HttpClient Pool)和超时控制,避免线程阻塞
- 内存压力:每个线程栈默认 1MB(可通过
-Xss256k调整),400 线程 ≈ 400MB 栈内存 - 文件描述符限制:Linux 默认 1024,需同步调大
ulimit -n和MaxRequestWorkers
推荐优化步骤
- 用
ab、jmeter或wrk做基准压测,观察 CPU、GC、线程阻塞、连接超时等指标 - 监控 Tomcat 的
/manager/status或 JMX,关注currentThreadCount、threadsBusy、processingTime - Apache 端启用
mod_status(ExtendedStatus On),访问/server-status查看 worker 状态 - 优先优化慢 SQL、缓存缺失、序列化开销等单点延迟,比堆线程更有效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










