Tomcat在CentOS上怎样优化
小樊
40
2025-12-31 05:09:27
CentOS 上 Tomcat 优化实操指南
一 基础环境与运行方式
- 使用受支持的 JDK 11/17(LTS),以 非 root 用户运行,目录与权限规范,便于安全与稳定。示例创建用户与目录:
- useradd -m -U -r -d /srv/tomcat -s /sbin/nologin tomcat
- chown -R tomcat:tomcat /srv/tomcat
- 采用 systemd 托管,示例 /etc/systemd/system/tomcat.service(按需调整内存与路径):
- Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk
- Environment=CATALINA_HOME=/srv/tomcat
- Environment=CATALINA_BASE=/srv/tomcat
- ExecStart=/srv/tomcat/bin/startup.sh
- ExecStop=/srv/tomcat/bin/shutdown.sh
- User=tomcat
- Restart=always
- 建议将 Tomcat 版本与内存匹配:内存 ≤2GB 的轻量实例优先 Tomcat 9.0;需 Jakarta EE 9+ 选择 Tomcat 10.1。
二 操作系统层优化
- 文件描述符限制:编辑 /etc/security/limits.conf
- 内核网络参数:编辑 /etc/sysctl.conf(执行 sysctl -p 生效)
- net.core.somaxconn = 65535
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_tw_recycle = 0(在 Linux 4.12+ 已移除,旧版如 CentOS 7 若启用可能带来副作用,建议保持为 0 或删除该行)
- net.ipv4.tcp_fin_timeout = 30
- net.ipv4.tcp_keepalive_time = 1200
- net.ipv4.ip_local_port_range = 1024 65535
- 透明大页(THP):建议禁用
- echo never > /sys/kernel/mm/transparent_hugepage/enabled
- echo never > /sys/kernel/mm/transparent_hugepage/defrag
- 如需开机持久化,可加入 /etc/rc.local 或 systemd 服务 ExecStartPre。
三 JVM 与 GC 调优
- 堆与元空间(示例为 2GB 内存实例,按规格等比放大/缩小)
- -Xms2g -Xmx2g
- -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
- -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=35
- -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/tomcat/gc.log
- 若以吞吐量为先,可改用并行 GC:
- -XX:+UseParallelGC -XX:ParallelGCThreads=$(nproc)
- 避免频繁扩缩堆:设置 -Xms 与 -Xmx 等值;根据应用特性再微调新生代/并发标记等参数。
四 Tomcat 连接器与线程池
- 协议选择:优先 NIO2(高并发、非阻塞),或安装 APR/native 提升 I/O(需编译安装依赖与库)。
- 线程池与队列(通过共享 Executor 解耦连接器与线程策略)
- 关键取舍
- maxThreads 并非越大越好,CPU 密集型宜小、I/O 密集型可适当放大;配合队列与 GC 能力综合评估。
- 未使用 AJP 时建议注释 AJP 连接器(端口 8009),减少攻击面与资源占用。
五 监控验证与常见瓶颈
- 监控与观测
- 启用 JMX 并用 JConsole/VisualVM 观察线程、堆、类加载与 GC 行为;辅以 Tomcat Manager/Status 或 Prometheus+Grafana 采集业务与容器指标。
- 快速自检命令
- ss -lntp | grep :8080
- netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
- jstat -gc 1s
- tail -f /var/log/tomcat/catalina.out /var/log/tomcat/gc.log
- 常见问题与对策
- 出现 OutOfMemoryError:先增大堆与元空间,排查内存泄漏(对象生命周期、缓存、线程局部变量),结合 GC 日志定位。
- 高并发下 响应变慢/抖动:线程过多引发上下文切换,适度下调 maxThreads、优化慢查询/慢接口、引入异步与缓存。
- TIME_WAIT 堆积:开启 tcp_tw_reuse、缩短 tcp_fin_timeout,必要时在前端用 Nginx/HAProxy 做连接复用与压缩卸载。