Tomcat 性能优化全指南
Tomcat 作为主流的 Java Web 容器,其性能直接影响应用的响应速度和并发能力。通过合理配置线程池、连接器、JVM 参数等,可以显著提升 Tomcat 的处理能力。本文将从执行器调优、连接器配置、JVM 优化等多个维度,详细介绍 Tomcat 性能优化的核心策略。
执行器(线程池)调优
Tomcat 的线程池(Executor)是处理请求的核心组件,负责管理请求处理线程。合理配置线程池参数可以避免线程频繁创建 / 销毁的开销,提升并发处理能力。
核心配置参数
1 | <Executor |
参数调优建议
maxThreads
:
决定并发处理的上限,需根据服务器 CPU 核心数调整。建议:- 4 核 CPU:设置为 200-400
- 8 核 CPU:设置为 400-800
过高会导致线程切换开销增大,反而降低性能。
minSpareThreads
:
避免请求突增时频繁创建线程,建议设置为maxThreads
的 1/10~1/5(如 500 线程池对应 50-100)。maxQueueSize
:
当线程全部繁忙时,请求会进入队列等待。建议设置为maxThreads
的 2-3 倍(如 500 线程对应 1000-1500),过大可能导致请求超时。prestartminSpareThreads
:
生产环境建议设为true
,启动时初始化核心线程,避免首笔请求的线程创建开销。
启用线程池
配置后需在 Connector 中引用,否则不会生效:
1 | <Connector |
连接器(Connector)调优
Connector 负责接收客户端请求并转发给线程池处理,其配置直接影响请求接收效率和连接管理。
核心配置参数
1 | <Connector |
参数调优建议
protocol
:
选择高效的 IO 模型:Http11Nio2Protocol
(NIO2):非阻塞 IO,支持高并发(推荐)。Http11AprProtocol
(APR):需安装 APR 库,性能接近原生 C 实现(适合超高性能场景)。- 避免使用
Http11Protocol
(BIO,阻塞 IO,性能差)。
maxConnections
:
允许的最大并发连接数,超过则排队。NIO2 模式默认 10000,建议根据服务器内存调整(如 8G 内存可设为 10000-20000)。acceptCount
:
当maxConnections
满后,请求排队的最大长度。建议与maxThreads
保持一致或略高(如 1000)。acceptorThreadCount
:
接收新连接的线程数,建议设置为 CPU 核心数(如 4 核设为 4)。compression
:
启用 GZIP 压缩可减少响应数据量(节省带宽,提升传输速度),但会增加 CPU 开销。建议对文本类内容(HTML、JSON)启用,对图片、视频等二进制文件禁用。maxKeepAliveRequests
:
长连接(Keep-Alive)中允许的最大请求数,默认 100。高并发场景可适当调大(如 200),减少 TCP 连接建立开销。tcpNoDelay
:
设为true
禁用 Nagle 算法,避免小数据包延迟发送(适合交互式应用,如网页)。enableLookups
:
设为false
禁用request.getRemoteHost()
的 DNS 查询,减少响应时间。
JVM 优化
JVM 配置对 Tomcat 性能影响极大,合理的内存分配和垃圾回收(GC)策略可以减少 GC 停顿,提升应用稳定性。
核心 JVM 参数
在 catalina.sh
(Linux)或 catalina.bat
(Windows)中配置 JAVA_OPTS
:
1 | # 堆内存配置 |
参数调优建议
1. 堆内存配置
-Xms
与-Xmx
:
初始堆内存与最大堆内存,建议设为相同值(避免运行时动态调整的开销)。根据服务器内存配置:- 8G 服务器:建议设为 4096m(50% 内存)。
- 16G 服务器:建议设为 8192m(50% 内存)。
-Xmn
:
年轻代内存大小,建议为堆内存的 1/3~1/4(如 4G 堆对应 1G 年轻代)。过小会导致对象提前进入老年代,增大 GC 压力;过大则老年代内存不足,易触发 Full GC。
2. 元空间配置
-XX:MetaspaceSize
与-XX:MaxMetaspaceSize
:
元空间用于存储类信息,默认不限制大小。建议设为 256m~512m,避免内存泄漏导致元空间无限增长。
3. 垃圾回收器选择
- G1 收集器(推荐):
适用于大堆内存(4G 以上),兼顾吞吐量和低延迟。关键参数:-XX:+UseG1GC
:启用 G1。-XX:MaxGCPauseMillis=200
:目标 GC 停顿时间(毫秒)。-XX:ParallelGCThreads
:并行 GC 线程数(建议设为 CPU 核心数)。
- CMS 收集器(备选):
适用于低延迟场景,但 JDK 9 后已废弃,建议优先使用 G1。 - 避免串行收集器:
仅适用于单核服务器或开发环境,生产环境禁用。
4. 其他优化参数
-XX:+DisableExplicitGC
:禁用System.gc()
(避免手动触发 Full GC)。-XX:+UseBiasedLocking
:启用偏向锁(减少无竞争场景的锁开销)。-Xss256k
:减小线程栈大小(默认 1M),支持更多线程(如 256k 可支持 4000+ 线程)。
其他优化策略
禁用不必要的组件
禁用 AJP 连接器:
AJP 用于与 Apache 等反向代理通信,若不使用可注释掉:1
2<!-- 注释掉 AJP 连接器 -->
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->关闭自动部署:
生产环境禁用Host
的autoDeploy
和unpackWARs
,减少文件扫描开销:1
<Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false">
2. 优化 Web 应用配置
共享 JAR 包:
多个应用共用的 JAR 包(如 Spring、MySQL 驱动)可放入$CATALINA_BASE/shared/lib
,避免重复加载(需在catalina.properties
中配置shared.loader
)。禁用 session 持久化:
非集群环境可关闭 session 持久化(默认StandardManager
会在 Tomcat 停止时保存 session):1
2
3<Context>
<Manager pathname="" /> <!-- 禁用 session 持久化 -->
</Context>调整 session 超时时间:
减少闲置 session 占用内存,在web.xml
中配置:1
2
3<session-config>
<session-timeout>30</session-timeout> <!-- 30 分钟超时 -->
</session-config>
3. 操作系统优化
调整文件描述符限制:
Linux 下默认文件描述符上限较低(如 1024),需调大以支持更多并发连接:1
2
3# 在 /etc/security/limits.conf 中添加
* soft nofile 65535
* hard nofile 65535优化 TCP 连接:
调整内核参数(/etc/sysctl.conf
):1
2
3
4net.ipv4.tcp_max_tw_buckets = 6000 # 控制 TIME_WAIT 状态的连接数
net.ipv4.tcp_tw_recycle = 1 # 快速回收 TIME_WAIT 连接
net.ipv4.tcp_tw_reuse = 1 # 允许重用 TIME_WAIT 连接
net.ipv4.tcp_syncookies = 1 # 启用 SYN cookies(防御 SYN 洪水攻击)
性能测试与监控
优化后需通过工具验证效果:
- 压力测试工具:
- JMeter:模拟多用户并发请求,测试响应时间、吞吐量。
- Apache Bench(ab):简单快速的 HTTP 压力测试工具。
- 监控工具:
- JConsole/JVisualVM:监控 JVM 内存、线程、GC 情况。
- Tomcat Manager:查看应用状态、线程池使用情况(
http://localhost:8080/manager/status
)。 - 日志分析:通过
catalina.out
排查慢请求、异常堆栈。
v1.3.10