Ubuntu Tomcat如何配置优化性能
小樊
38
2025-12-11 02:07:16
Ubuntu 上 Tomcat 性能优化实操指南
一 基础环境与运行账户
- 使用 JDK 11/17(LTS),以 非 root 用户运行 Tomcat,降低安全风险。创建专用用户与目录,并配置环境变量与 systemd 服务,确保进程稳定与开机自启。示例(按你的实际路径与版本调整):
- 创建用户与目录
- sudo useradd -m -U -r -d /srv/tomcat -s /usr/sbin/nologin tomcat
- sudo mkdir -p /srv/tomcat && sudo chown -R tomcat:tomcat /srv/tomcat
- 环境变量(/etc/profile.d/tomcat.sh)
- export CATALINA_HOME=/srv/tomcat
- export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
- export JAVA_OPTS=“-Xms512m -Xmx1024m -XX:+UseG1GC”
- systemd 服务(/etc/systemd/system/tomcat.service)
- [Service] 中设置 User=tomcat、Group=tomcat、Environment=JAVA_HOME、CATALINA_HOME、CATALINA_BASE,ExecStart=/srv/tomcat/bin/startup.sh,ExecStop=/srv/tomcat/bin/shutdown.sh,Restart=always
- 注意:JDK 8 使用 PermSize/MaxPermSize;JDK 8+ 使用 Metaspace(无需 PermSize/MaxPermSize)。
二 Connector 与线程模型优化
- 选择高性能连接器:优先 NIO2 或 HTTP/2(Tomcat 8.5+ 支持 HTTP/2),提升并发与头部处理能力。
- 线程与队列关键参数(按并发与 RTT 实测微调):
- maxThreads:最大工作线程,默认 200;CPU 密集型不宜过大,I/O 密集型可适当提高。
- minSpareThreads:最小空闲线程,保证突发流量有线程可用。
- acceptCount:当线程耗尽时的排队队列长度,配合 maxThreads 共同决定最大排队能力。
- connectionTimeout:连接超时,建议 10000–20000 ms,避免长连接占用线程。
- enableLookups:设为 false,关闭 DNS 反查,降低延迟。
- URIEncoding:设为 UTF-8,避免中文乱码。
- 启用压缩:减少传输体积,对文本/JSON/JS/CSS 效果明显。
- 示例(HTTP/1.1 + NIO2,按需启用 HTTP/2):
- 提示:高并发短连接场景可适当提高 maxThreads 与 acceptCount;长连接或慢客户端场景应降低超时并配合 keep-alive 策略。
三 JVM 调优与 GC 策略
- 堆大小:将 -Xms 与 -Xmx 设为相同,避免运行期扩缩堆带来的抖动;一般设为可用内存的 约 50%,并预留给系统与其他进程。
- 垃圾回收器:
- JDK 8:可选 Parallel GC(吞吐优先)或 CMS(低延迟,已废弃,建议迁移至 G1)。
- JDK 11/17:推荐 G1 GC(大堆与长生命周期对象更稳),必要时结合应用特点调参。
- 常用参数模板(示例为 2GB 内存实例,按规格调整):
- JAVA_OPTS=“-Xms1536m -Xmx1536m -XX:+UseG1GC -XX:MaxGCPauseMillis=200”
- 开启 GC 日志(便于诊断与回溯):
- -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/srv/tomcat/logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M
- 注意:JDK 8 才需要 PermSize/MaxPermSize;JDK 8+ 使用 Metaspace(可设置 -XX:MaxMetaspaceSize)。
四 操作系统与网络优化
- 文件描述符限制:提升进程可打开文件数,避免 “Too many open files”。
- 临时:ulimit -n 65535
- 永久:/etc/security/limits.conf 增加
- tomcat soft nofile 65535
- tomcat hard nofile 65535
- TCP 内核参数(/etc/sysctl.conf 或 sysctl -w 临时生效):
- net.core.somaxconn=8192
- net.ipv4.tcp_max_syn_backlog=4096
- net.ipv4.tcp_tw_reuse=1
- net.ipv4.tcp_fin_timeout=60
- net.ipv4.tcp_keepalive_time=1200
- net.core.rmem_max=12582912
- net.core.wmem_max=12582912
- 使配置生效:sysctl -p
- 说明:不同内核/云厂商环境默认值差异较大,建议基于监控逐步调优,避免一次性大幅改动。
五 监控验证与上线流程
- 监控与诊断:
- JMX + JConsole/VisualVM 观察线程池、堆内存、GC 次数/停顿、类加载等指标。
- 分析 access log(响应时间、状态码分布)、catalina.out 与 GC 日志,定位瓶颈与异常。
- 日志与异步:
- 将访问日志与业务日志分离,必要时使用 异步日志(AsyncFileHandler)降低日志 I/O 对请求路径的影响。
- 压测与灰度:
- 使用 JMeter/ab/wrk 进行阶梯压测,观察 P95/P99 延迟、吞吐、错误率 与 GC 行为,按指标回调优参数。
- 建议 蓝绿/金丝雀 发布,先小流量验证,再全量切换。
- 架构层面:
- 静态资源交由 Nginx/CDN,Tomcat 专注动态请求;必要时前置 Nginx/HAProxy 做负载均衡与 TLS 终止。