提升 Linux 上 Tomcat 并发能力的实用方案
从系统、连接器/线程池、JVM 与应用四个层面协同优化,才能稳定提升并发。下面给出可落地的步骤与关键参数。
一 操作系统层优化
- 文件描述符限制:并发连接会消耗大量文件描述符,先放宽限制并验证。
- 查看与临时设置:ulimit -n;ulimit -n 65535
- 永久生效:/etc/security/limits.conf 增加
-
-
- tomcat soft nofile 65535;tomcat hard nofile 65535
- 系统级上限:/etc/sysctl.conf 增加 fs.file-max=655350;执行 sysctl -p
- 验证:lsof -p <tomcat_pid> | wc -l
- TCP/IP 关键参数(/etc/sysctl.conf 或 sysctl -w):
- net.core.somaxconn=4096(全连接队列上限)
- net.ipv4.tcp_tw_reuse=1(复用 TIME_WAIT 套接字)
- net.ipv4.tcp_max_syn_backlog=4096(半连接队列)
- net.ipv4.tcp_fin_timeout=60
- 可选:net.ipv4.tcp_tw_recycle=0(在 NAT/云环境易出问题,建议关闭)
- 可选:net.ipv4.tcp_fastopen=3
- 可选:调大套接字缓冲 net.core.rmem_max / wmem_max(如 1310720)以适配高带宽
- 说明:Tomcat 的 maxThreads、acceptCount、maxConnections 等必须与上述 FD 与内核队列上限匹配,否则会出现连接拒绝或性能受限。
二 Tomcat 连接器与线程池优化
- 使用共享线程池(Executor)+ NIO/NIO2 连接器,减少线程创建开销并提升 I/O 能力。
- 推荐参数基线(示例为 8 核):
- Executor:
- maxThreads:400(并发处理上限,按 CPU 与压测微调)
- minSpareThreads:80(建议为 maxThreads 的约 20%)
- prestartminSpareThreads:true(预热,降低首访延迟)
- maxQueueSize:100(队列过长会堆积,过短易拒绝)
- Connector(HTTP/1.1):
- protocol:org.apache.coyote.http11.Http11Nio2Protocol(或 NIO)
- port:8080;redirectPort:8443
- connectionTimeout:20000(毫秒)
- acceptCount:200(建议为 maxThreads 的 40%~60%)
- enableLookups:false(关闭 DNS 反查)
- compression:on;compressionMinSize:2048(2KB 起压)
- useSendfile:true(静态资源零拷贝)
- keepAliveTimeout:15000~30000;maxKeepAliveRequests:100~200
- maxConnections:10000(NIO 默认较高,注意与 FD 上限匹配)
- 要点:队列与线程不是越大越好;过大的 acceptCount 会造成排队延迟与超时,过小会触发拒绝;NIO2 在高并发下通常优于 NIO,但需以压测为准。
三 JVM 层优化
- 堆与元空间:
- -Xms 与 -Xmx 设为相同值(如 4G),避免运行期扩缩容抖动
- -XX:MetaspaceSize=256M;-XX:MaxMetaspaceSize=512M
- 垃圾回收(按延迟/吞吐/内存规模选择):
- 低延迟(<200ms):-XX:+UseG1GC 或 -XX:+UseZGC(JDK 11+)
- 高吞吐:-XX:+UseParallelGC
- 大堆(>32G):优先考虑 ZGC/Shenandoah
- 可选诊断与稳定性参数:
- -XX:+HeapDumpOnOutOfMemoryError;-XX:HeapDumpPath=…
- -XX:+PrintGCDetails;-XX:+PrintGCDateStamps;-Xloggc:…
- 原则:堆过大增加 GC 停顿与内存压力,过小易频繁 GC;以压测与 GC 日志为依据微调。
四 应用与架构层优化
- 连接池与数据库:使用高性能连接池(如 HikariCP/Druid),合理设置最大连接、最小空闲、超时与验证查询,避免数据库成为瓶颈。
- 静态资源:启用压缩(已在上文 Connector 配置),并将静态资源交由 Nginx/Apache HTTPD/CDN 托管,减轻 Tomcat 负载。
- 线程与阻塞:减少在请求线程中执行阻塞操作(如慢查询、外部接口同步调用),引入异步 I/O、线程池隔离、熔断与超时控制。
- 监控与验证:开启 JMX 远程监控(VisualVM/JConsole),持续观察线程池、队列、连接、GC、CPU、网络与磁盘 I/O,配合压测工具(如 JMeter/ wrk)迭代参数。
五 快速检查清单与示例配置
- 快速检查清单
- 系统:ulimit -n ≥ 65535;/proc/sys/fs/file-max 足够大
- 内核:somaxconn ≥ 4096;tcp_tw_reuse=1;tw_recycle=0
- Tomcat:线程池与队列匹配业务;NIO/NIO2;压缩与长连接合理配置
- JVM:Xms=Xmx;选择合适的 GC;开启 GC/内存诊断
- 应用:连接池、静态资源、异步化、熔断与超时
- 示例片段(server.xml 关键部分)
- 提示:以上为基线值,务必在你的硬件与业务场景下压测验证,逐步微调,避免一次性拉满参数导致不稳定。