Linux如何优化Tomcat启动速度
小樊
45
2025-12-20 20:05:37
Linux下优化 Tomcat 启动速度
一 快速定位瓶颈
- 查看是否卡在生成 SecureRandom(常见于 Tomcat 8/9):日志出现 “Creation of SecureRandom instance … took [xx,xxx] ms”。同时检查系统熵值:cat /proc/sys/kernel/random/entropy_avail,若数值很低(如个位数),说明熵池不足,会显著拖慢启动。该问题在云主机、虚拟机中尤为常见。
二 高性价比优化清单
-
加速熵源(解决 SecureRandom 卡顿)
- 安装并启动 rngd 增加熵池(推荐在物理机或有硬件 RNG 的虚机上):
- RHEL/CentOS:yum install rng-tools && systemctl start rngd && systemctl enable rngd
- Ubuntu/Debian:apt-get install rng-tools && systemctl start rngd && systemctl enable rngd
- 或改用非阻塞熵源(简单有效,安全性略有取舍):
- 方式一:在 $JAVA_HOME/jre/lib/security/java.security 中将
- securerandom.source=file:/dev/random 改为 securerandom.source=file:/dev/urandom
- 方式二:在 bin/catalina.sh 的 JAVA_OPTS 中添加
- -Djava.security.egd=file:/dev/urandom
- 以上任一方式通常即可消除启动阶段长时间等待熵的问题。
-
精简应用与组件(减少初始化工作量)
- 删除 webapps 下不需要的工程(如 examples、docs、host-manager 等),避免无谓解压与初始化。
- 关闭不必要的功能以缩短扫描时间:
- 在 conf/context.xml 中减少 TLD/JSP/WebSocket 扫描:
- 在应用的 WEB-INF/web.xml 将 ,跳过注解扫描(仅在确实不需要 Servlet 3.0 注解时)。
- 多应用并行启动:在 conf/server.xml 的 上设置 startStopThreads(如设置为 CPU 核数,或 0 表示按处理器数量自动)以并行部署应用。
-
调整线程与连接器(避免启动期线程争用)
- 使用 NIO 或 NIO2 连接器提升 I/O 与启动效率:
- protocol=“org.apache.coyote.http11.Http11NioProtocol”
- 合理配置线程池(示例为中等规模场景,需结合实际压测微调):
-
- <Connector port=“8080” protocol=“org.apache.coyote.http11.Http11NioProtocol”
- executor=“tomcatThreadPool” connectionTimeout=“20000” redirectPort=“8443” URIEncoding=“UTF-8”
- enableLookups=“false” compression=“on” compressionMinSize=“2048”
- compressableMimeType=“text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json”/>
- 说明:enableLookups=false 避免启动时进行 DNS 反向解析;compression 主要影响运行期性能,但对首包与总体就绪时间也有正向作用。
-
JVM 启动参数(减少 Full GC 与抖动)
- 在 bin/setenv.sh(若不存在则创建)设置基础参数:
- JAVA_OPTS=“-server -Xms2g -Xmx2g -Xss512k -Djava.awt.headless=true -Dfile.encoding=UTF-8”
- 垃圾回收器建议:JDK 8 可选 -XX:+UseG1GC;JDK 11+ 默认 G1 通常无需额外指定。
- 将 -Xms 与 -Xmx 设为相同,减少运行期堆大小调整带来的停顿与抖动,对启动与稳态均有益。
-
系统与存储层面(排除基础资源瓶颈)
- 提升文件描述符限制(/etc/security/limits.conf):
- 可选:在 /etc/sysctl.conf 中适度提高网络与文件句柄上限(如 net.core.somaxconn、fs.file-max),并执行 sysctl -p 生效。
- 如仍慢,检查是否使用 SSD、是否存在 I/O 高占用进程,必要时迁移至更快的存储或优化磁盘 I/O 调度策略。
三 推荐最小改动组合
- 仅需快速见效时,优先执行以下三项:
- 安装并启动 rngd(或设置 -Djava.security.egd=file:/dev/urandom)。
- 删除 webapps 下无用应用,并在 web.xml 设置 metadata-complete=“true”。
- 在 server.xml 使用 NIO 连接器并配置合理线程池(示例见上)。
四 验证与回退
- 重启后在 catalina.out 观察:
- 是否仍有 “SecureRandom creation took … ms” 的长时间等待(应显著缩短或消失)。
- 各应用的部署日志是否并行出现,整体启动时长是否下降。
- 若启用 /dev/urandom 或调整熵源,需评估对安全敏感场景的适用性;出现异常可回退到 /dev/random 并配合 rngd 提升熵池。