Debian 上 Tomcat 性能优化实战指南
一 基线评估与监控
- 建立可观测性:启用 JMX 远程监控(JConsole/VisualVM),采集 线程池、堆内存、类加载、请求处理 等关键指标;结合系统工具 top/htop、vmstat、netstat、free、df 观察 CPU、内存、I/O 与网络;应用侧接入 JavaMelody、Lambda Probe 观察 SQL、会话、页面耗时等;必要时用 Prometheus + Grafana 做长期可视化与告警。每次调参前后保留基线数据,便于量化收益与回滚。
二 连接器与线程池优化
- 使用 NIO/NIO2 非阻塞 I/O:在高并发下较 BIO 有更高吞吐,配置示例:protocol=“org.apache.coyote.http11.Http11Nio2Protocol”。
- 启用 HTTP/2(Tomcat 8.5+):多路复用与头部压缩可显著降低页面加载时延,配置示例:protocol=“org.apache.coyote.http2.Http2Protocol”、SSLEnabled=“true”。
- 合理设置连接与超时:如 connectionTimeout=20000(毫秒)、maxConnections(全连接队列/可建立连接上限)、以及当线程耗尽时的 acceptCount(等待队列)。
- 线程池与执行器:通过 统一管理线程,提高可维护性;核心参数 maxThreads、minSpareThreads、maxQueueSize;Connector 通过 executor 属性引用共享线程池。
- 静态资源与压缩:启用 GZIP 压缩(compression=“on”),并设置可压缩 MIME 类型(如 text/html、text/css、application/json 等),减少带宽与时延。
- 反向代理与协议选择:若前置 Nginx/HAProxy,可让反向代理处理静态资源与 TLS,Tomcat 专注动态请求;如无需 AJP,建议禁用 AJP/1.3 连接器以节省资源。
示例 server.xml 片段(要点)
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="50" maxQueueSize="100"/>
<Connector executor="tomcatThreadPool"
port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000" redirectPort="8443"
compression="on"
compressableMimeType="text/html,text/xml,text/plain,application/json,application/xml"/>
<Connector port="8443" protocol="org.apache.coyote.http2.Http2Protocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
certificateFile="conf/localhost-rsa-cert.pem"
certificateChainFile="conf/localhost-rsa-chain.pem" type="RSA"/>
</SSLHostConfig>
</Connector>
<!-- <Connector port="8011" protocol="AJP/1.3" redirectPort="8443" /> -->
提示:参数需结合 CPU 核数、内存容量、业务 RT 与 P95/P99 目标 逐步压测调优,避免“拍脑袋”设置。
三 JVM 与内存调优
- 堆与元空间:设置初始/最大堆 -Xms/-Xmx(建议两者等值以避免运行期扩缩堆带来的抖动),Java 8+ 使用 Metaspace 并配置 -XX:MaxMetaspaceSize;避免设置已废弃的 -XX:PermSize/-XX:MaxPermSize。
- 垃圾回收器:优先选用 G1GC(适合大堆与高并发、停顿可控),如: -XX:+UseG1GC;也可根据负载与延迟目标尝试 ParallelGC 等。
- 容器与熵源:在容器/虚拟化环境开启 -XX:+UseContainerSupport;为加速启动可设置 -Djava.security.egd=file:/dev/./urandom。
- 堆大小经验值:初始堆 -Xms 可取物理内存的 1/4~1/6,最大堆 -Xmx 不超过物理内存的 70%~80%,并预留 20%~30% 给操作系统与其他进程;最终以压测与 GC 日志为准。
- 验证与观测:用 jmap -heap 查看堆配置与使用情况,结合 JMX/Grafana 观察 GC 次数/停顿、晋升失败、Full GC 等指标,持续迭代参数。
示例(写入 $CATALINA_HOME/bin/catalina.sh 的 JAVA_OPTS/CATALINA_OPTS)
export JAVA_OPTS="$JAVA_OPTS -server -Xms2g -Xmx2g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC -XX:+UseContainerSupport \
-Djava.awt.headless=true -Dfile.encoding=UTF-8 \
-Djava.security.egd=file:/dev/./urandom"
说明:具体数值需结合实例规格与业务特征压测后确定。
四 操作系统与网络优化
- 文件描述符:提升进程可打开文件数,如 ulimit -n 65535;在 systemd 服务单元中设置 LimitNOFILE=65535 以持久化。
- TCP 内核参数(/etc/sysctl.conf):
- net.core.somaxconn = 65535(全连接队列上限)
- net.ipv4.tcp_max_syn_backlog = 65535(半连接队列)
- net.ipv4.ip_local_port_range = 1024 65535(临时端口范围)
- net.ipv4.tcp_tw_reuse = 1(TIME_WAIT 复用)
- net.ipv4.tcp_fin_timeout = 30(快速回收)
执行 sysctl -p 使配置生效。
- 资源隔离与稳定性:为 Tomcat 配置 专用用户/组、合理的 CPU/内存 limits,并使用 systemd 管理进程生命周期与自动重启(Restart=always/RestartSec=10)。
五 应用层与架构优化
- 数据库连接池:使用高性能连接池(如 HikariCP),合理配置 最大连接数、最小空闲、超时、验证查询,避免连接风暴与泄漏。
- 缓存与异步:引入 Redis/Memcached 做热点数据缓存;对耗时任务采用 异步处理/消息队列,缩短请求 RT 并提升吞吐。
- 静态资源与 CDN:由 Nginx 或 CDN 承载静态资源,开启长缓存与协商缓存,Tomcat 仅处理动态业务。
- 持续压测与 A/B 验证:以 JMeter/Locust 进行容量与稳定性压测,围绕 P50/P95/P99、错误率、GC 停顿 等指标迭代参数;每次变更保留回滚方案。