温馨提示×

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 表示按处理器数量自动)以并行部署应用。
  • 调整线程与连接器(避免启动期线程争用)

    • 使用 NIONIO2 连接器提升 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):
        • soft nofile 65536
        • hard nofile 65536
    • 可选:在 /etc/sysctl.conf 中适度提高网络与文件句柄上限(如 net.core.somaxconn、fs.file-max),并执行 sysctl -p 生效。
    • 如仍慢,检查是否使用 SSD、是否存在 I/O 高占用进程,必要时迁移至更快的存储或优化磁盘 I/O 调度策略。

三 推荐最小改动组合

  • 仅需快速见效时,优先执行以下三项:
    1. 安装并启动 rngd(或设置 -Djava.security.egd=file:/dev/urandom)。
    2. 删除 webapps 下无用应用,并在 web.xml 设置 metadata-complete=“true”
    3. server.xml 使用 NIO 连接器并配置合理线程池(示例见上)。

四 验证与回退

  • 重启后在 catalina.out 观察:
    • 是否仍有 “SecureRandom creation took … ms” 的长时间等待(应显著缩短或消失)。
    • 各应用的部署日志是否并行出现,整体启动时长是否下降。
  • 若启用 /dev/urandom 或调整熵源,需评估对安全敏感场景的适用性;出现异常可回退到 /dev/random 并配合 rngd 提升熵池。

0