Ubuntu Tomcat性能调优秘籍
小樊
37
2025-11-22 07:54:26
Ubuntu 上 Tomcat 性能调优秘籍
一 基线评估与监控
- 明确业务目标:以P95/P99 延迟、吞吐量(RPS)、错误率为核心指标,先建立可复现的压测基线(如 ab/wrk/jmeter),再逐项优化并回归验证。
- JVM 与 GC 监控:开启 GC 日志,便于定位停顿与回收压力。示例(放入 catalina.sh 的 JAVA_OPTS):
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/tomcat/logs/gc.log
使用 JConsole/VisualVM 观察堆内存、线程、类加载与 GC 行为,配合 MAT 分析内存泄漏。
- 线程与连接器监控:关注 maxThreads、currentThreadsBusy、acceptCount、connectionTimeout 等指标,判断线程是否成为瓶颈或队列是否堆积。
二 Tomcat 连接器与线程池
- 选择高性能连接器:优先使用 NIO/NIO2;在 Tomcat 8.5+ 启用 HTTP/2 提升多路复用与头部压缩能力。示例:
protocol=“org.apache.coyote.http11.Http11Nio2Protocol” 或启用 HTTP/2 协议。
- 线程池关键参数:
- maxThreads:最大工作线程,建议以CPU 核数 × 2 ~ 4为起点,结合压测逐步上调;过高会增加上下文切换与内存占用。
- minSpareThreads:保底空闲线程,保证突发流量有线程可复用。
- acceptCount:当线程耗尽时的排队长度,适度增大可降低连接拒绝,但过大将增加排队时延。
- 其他:关闭 DNS 反查(enableLookups=“false”)、设置 URIEncoding=“UTF-8”、合理 connectionTimeout。
- 启用压缩与连接优化:对文本类资源开启 GZIP(如 text/html、application/json),并设置合适的 compressionMinSize,减少网络字节量、缩短首包时间。
三 JVM 与垃圾回收
- 堆与模式:设置 -Xms 与 -Xmx(建议等值,避免运行期扩缩堆带来的抖动),启用服务器模式 -server。
- 元空间与 GC 选择:
- JDK 8+ 使用 Metaspace(移除 PermSize/MaxPermSize);
- 大堆与低停顿优先 G1GC;多核吞吐优先 Parallel GC。
- 常用参数示例(按应用内存与 GC 日志再微调):
- -server -Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200
- 必要时调节新生代比例(如 -XX:NewRatio)与并行 GC 线程数(如 -XX:ParallelGCThreads)。
- 熵源与启动慢:若观察到 SecureRandom 初始化慢,可安装 rng-tools 提升熵池,或在 $JAVA_HOME/jre/lib/security/java.security 中将
securerandom.source=file:/dev/random 调整为 /dev/./urandom(权衡安全性与启动速度)。
四 Ubuntu 系统层面优化
- 文件描述符限制:提升进程可打开文件数,避免“too many open files”。
- 临时:ulimit -n 65535
- 永久:在 /etc/security/limits.conf 增加
- soft nofile 65535
- hard nofile 65535
- 网络与内核参数(/etc/sysctl.conf 或 sysctl -w 临时):
- 提升半连接与全连接队列:net.ipv4.tcp_max_syn_backlog=4096;net.core.somaxconn=4096
- 加速回收 TIME_WAIT:net.ipv4.tcp_tw_reuse=1;net.ipv4.tcp_fin_timeout=60
- 降低重试与握手开销:net.ipv4.tcp_synack_retries=1;net.ipv4.tcp_syn_retries=1
- 缓冲区与本地端口:net.core.rmem_max/wmem_max=12582912;net.ipv4.ip_local_port_range=1024 65535
修改后执行 sysctl -p 使配置生效。
五 应用与运维实践
- 静态资源与反向代理:将图片/CSS/JS等静态资源交由 Nginx/Apache 或 CDN 处理,Tomcat 专注动态请求,降低容器负载与网络往返。
- 数据库与连接池:使用成熟连接池(如 HikariCP/DBCP/C3P0),合理设置最大连接、最小空闲、超时与验证查询,避免连接风暴与泄漏。
- 日志与异步:生产环境将日志级别调至 WARNING/ERROR,在 Tomcat 8+ 采用 AsyncFileHandler 减少同步写磁盘阻塞;用 logrotate 做按日/按大小轮转,避免磁盘占满。
- 安全与稳定:仅在需要时开启 SSL/TLS;变更 server.xml 的 shutdown 端口 与 管理端口,限制管理界面访问;任何参数变更先在测试环境验证再上线。