温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Tomcat如何优化启动速度

发布时间:2026-01-11 15:26:50 来源:亿速云 阅读:152 作者:小樊 栏目:编程语言

Tomcat 启动加速实用清单

一 定位瓶颈

  • 查看 catalina.outlocalhost-startStop-*.log,若出现如:
    “Creation of SecureRandom instance for session ID generation … took [55,507] ms”,基本可判定为熵源阻塞导致启动慢。
  • 检查系统熵池:执行 cat /proc/sys/kernel/random/entropy_avail,数值偏低(如低于 100)时更易阻塞。
  • 若未明显看到 SecureRandom 日志,再排查是否因部署应用过多JVM 内存不足XML/依赖扫描耗时引起。

二 快速见效的优化

  • 熵源优化(最立竿见影)
    • 方式一:在 $TOMCAT_HOME/bin/catalina.sh(或 setenv.sh)加入
      JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"(注意路径中的 “./” 在某些 JDK 7 版本中用于规避 Bug)。
    • 方式二:编辑 $JAVA_HOME/jre/lib/security/java.security,将
      securerandom.source=file:/dev/random 改为 securerandom.source=file:/dev/./urandom
    • 方式三(硬件支持时):安装并启动熵守护进程
      yum install rng-tools && systemctl enable --now rngd,显著提升 /dev/random 可用性。
  • 精简部署与扫描
    • 删除 webapps 下不需要的应用(如 docs、examples、host-manager、ROOT)。
    • 减少不必要的 JARXML 依赖,降低类路径扫描成本。
    • 关闭不需要的框架特性:
      • conf/context.xml 中限制 TLD 扫描:
        <JarScanner><JarScanFilter defaultTldScan="false"/></JarScanner>
      • 禁用 WebSocket/JSP(若未使用):
        <Context containerSciFilter="org.apache.tomcat.websocket.server.WsSci | org.apache.tomcat.websocket.server.JasperInitializer"/>
      • 在应用的 WEB-INF/web.xml 设置 <web-app metadata-complete="true">,跳过注解/Web 片段扫描。
  • 并行启动多个应用
    • conf/server.xml<Host> 上设置:
      <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false" startStopThreads="0">
      startStopThreads 设为 0 表示按CPU 核心数并行;也可设为大于 1 的数值(一般不超过核心数)。
  • JVM 内存初始化
    • catalina.sh/setenv.sh 设置:
      JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx1024m"(数值按业务与容器规格调整,建议 Xms 与 Xmx 接近以减少运行时扩缩容抖动)。

三 配置示例

  • 设置熵源(setenv.sh)
#!/bin/sh
export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
  • server.xml 并行启动与连接器(按需)
<Host name="localhost" appBase="webapps" unpackWARs="true"
      autoDeploy="false" deployOnStartup="false" startStopThreads="0"/>

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
           connectionTimeout="20000" redirectPort="8443"
           maxThreads="200" minSpareThreads="50" acceptCount="100"
           compression="on" compressionMinSize="2048"
           compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>
  • 关闭 TLD/WebSocket/JSP 扫描(conf/context.xml)
<Context>
  <JarScanner>
    <JarScanFilter defaultTldScan="false"/>
  </JarScanner>
  <Parameter name="containerSciFilter"
            value="org.apache.tomcat.websocket.server.WsSci | org.apache.tomcat.websocket.server.JasperInitializer"/>
</Context>
  • 应用 web.xml(若不使用注解/Web 片段)
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         version="4.0" metadata-complete="true">
  <!-- your config -->
</web-app>
  • Spring Boot 内嵌 Tomcat(application.yml)
server:
  tomcat:
    threads:
      min-spare: 20
      max: 200
    connection-timeout: 5000ms

以上示例分别覆盖了熵源并行启动连接器与压缩扫描关闭内嵌容器的常见做法,可按需组合启用。

四 进阶与注意事项

  • 连接器选择:优先使用 NIOHttp11NioProtocol)以获得更好的 I/O 性能;必要时再考虑 APR/Native
  • 系统资源与内核参数:适当提升 文件描述符限制/etc/security/limits.conf)、优化 网络/文件句柄 等内核参数,避免资源瓶颈放大启动耗时。
  • 监控与验证:使用 JConsole/VisualVM 观察 JVM 内存、线程、类加载 等指标;每次变更后用标准化脚本重启并对比 catalina.out 时间戳与 SecureRandom 日志。
  • 风险提示:将 securerandom.source 改为 /dev/urandom 或以 -Djava.security.egd 指定非阻塞熵源,会在极少数对密码学强随机性极端敏感的场景下降低随机强度;一般业务应用可接受,涉及高安全场景请结合 rngd 增强熵池或评估影响。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI