Debian上Tomcat性能调优指南
线程池是Tomcat处理并发请求的核心资源,合理配置可避免线程创建/销毁的开销,提升请求处理效率。
server.xml中添加<Executor>元素,设置关键参数:<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="50" maxQueueSize="100" />
maxThreads:线程池最大线程数(根据服务器CPU核心数和应用负载调整,建议为CPU核心数的2-4倍);minSpareThreads:保持的最小空闲线程数(避免频繁创建线程,建议≥50);maxQueueSize:请求队列最大长度(超过则拒绝请求,防止内存溢出)。executor属性指定线程池名称:<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" />
推荐使用NIO或NIO2连接器(protocol="org.apache.coyote.http11.Http11Nio2Protocol"),其非阻塞I/O模型更适合高并发场景。合理的JVM内存配置可减少垃圾回收(GC)频率,避免内存溢出(OOM),提升应用稳定性。
JAVA_OPTS或CATALINA_OPTS调整堆内存大小(初始堆-Xms与最大堆-Xmx保持一致,避免频繁扩容):export JAVA_OPTS="-Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=256m"
-Xms:初始堆内存(建议为服务器内存的1/4-1/2);-Xmx:最大堆内存(不超过服务器物理内存的80%);-XX:MaxMetaspaceSize:元空间最大大小(Java 8+替代永久代,避免元空间溢出)。export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
-XX:+UseG1GC:启用G1GC;-XX:MaxGCPauseMillis:设置最大GC暂停时间(目标≤200ms)。连接器参数直接影响请求处理的吞吐量和响应时间。
<Connector ... compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,application/json" />
compression:启用压缩(on);compressionMinSize:最小压缩大小(≥2048字节才压缩);compressableMimeType:需要压缩的MIME类型。<Connector ... connectionTimeout="20000" acceptCount="1000" />
connectionTimeout:连接超时时间(毫秒,默认20000ms);acceptCount:所有线程繁忙时的最大排队请求数(避免拒绝请求,建议≥1000)。调整Linux内核参数,提升Tomcat处理高并发连接的能力。
ulimit -n 65535
永久生效可修改/etc/security/limits.conf,添加:* soft nofile 65535
* hard nofile 65535
/etc/sysctl.conf,添加以下配置并执行sysctl -p生效:net.core.somaxconn = 65535 # 监听队列最大长度
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列最大长度
net.ipv4.ip_local_port_range = 1024 65535 # 本地端口范围
net.ipv4.tcp_tw_reuse = 1 # 复用TIME_WAIT连接
net.ipv4.tcp_fin_timeout = 30 # TIME_WAIT超时时间(秒)
这些参数可减少连接建立/关闭的开销,提升并发处理能力。应用代码的性能直接影响Tomcat的整体表现,需重点优化以下方面:
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
@Async)避免阻塞请求线程。持续监控Tomcat性能,识别瓶颈并进行针对性调整:
-Xloggc:/path/to/gc.log参数记录GC日志,使用GCViewer分析GC频率和暂停时间,调整堆大小或垃圾回收器参数。sudo systemctl restart tomcat9