Tomcat启动性能:如何防止在部署所有Web应用程序之前等待?

时间:2018-03-16 10:30:51

标签: java performance tomcat startup tomcat8

我们的应用中有20场战争,我遇到了无法解决的问题。

我们有两种Tomcat部署案例:

  1. 开始后复制工件
    当Tomcat已经启动时复制了你的战争,你就可以在所有应用程序启动并运行之前调用已经启动的应用程序。

  2. 在开始之前复制工件 当Tomcat尚未启动时复制战争时,在所有应用程序启动并运行之前,您将无法调用应用程序。

  3. 是否有可能配置Tomcat以防止在第二种情况下部署所有战争之前等待?

    提前致谢。

2 个答案:

答案 0 :(得分:1)

默认的Tomcat配置会使应用程序部署看起来像无政府状态,但有一种方法可以通过以定义的顺序启动应用程序来提供更可预测的行为。您仍然必须等待应用程序在响应请求之前部署,但至少如果需要首先加载其中一个应用程序,您可以为其提供应有的优先级。有趣的是,阅读Tomcat startup documentation并没有给出任何线索。

要实现此目的,您可以实现具有应用程序的任意数量的服务/连接器/引擎/主机。如果你想让所有人都在同一个端口接听,你可能需要一个反向代理。每个应用程序都将部署在自己的目录中,而不是webapps目录。这就是我正在做的事情:

  <Service name="app1">
    <Connector port="8881" protocol="HTTP/1.1" address="localhost" />
    <Engine name="Engine1" defaultHost="localhost">
      <Host name="localhost"  appBase="app1" unpackWARs="true" autoDeploy="true" >
      </Host>
    </Engine>
  </Service>

  <Service name="app2">
    <Connector port="8882" protocol="HTTP/1.1" address="localhost" />
    <Engine name="Engine2" defaultHost="localhost">
      <Host name="localhost"  appBase="app2" unpackWARs="true" autoDeploy="true" >
      </Host>
    </Engine>
  </Service>
...

修改1 这不是第二种情况的答案,但如果您想在启动期间避免部署,可以在Host configuration中使用deployOnStartup="false",这将大大加快启动速度。这意味着当Tomcat已经启动时,所有部署都将完成。以下是默认Tomcat 8.5(CentOS 7,6 vcpus)的前/后结果:

18-Mar-2018 11:53:09.932 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 10628 ms
18-Mar-2018 11:53:56.200 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 49 ms

编辑2 old answer建议并且我同意,非压缩战争将加速部署。也许你赢得10%-15%的启动时间。

编辑3 至于上面的两个编辑,另一个参数可以帮助你更快地启动启动:主机定义中的startStopThreads默认为1.将其调整为你拥有的cpu数,在我的测试中使用6个vcpus它是使用1000 sample wars来快速启动启动两次以进行部署。这一点在用户邮件列表中是discussed,尽管它看起来并不常用。此参数的副作用还是使关闭更快,但Tomcat不会记录该指标。

18-Mar-2018 17:02:45.678 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 15947 ms
18-Mar-2018 17:07:20.890 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 7594 ms

您可以混合我提出的几个想法,并随时向我们提供有关所取得的成绩的反馈。我正在标记您的问题并建议进行修改以提供更多可见性,以帮助其他用户。

您也可以查看官方Tomcat FasterStartUp,但它有点弱。

答案 1 :(得分:0)

保留autoDeploy="true",但为deployOnStartup="false"中的<Host>元素设置server.xml。 Tomcat将在没有任何Web应用程序的情况下启动,然后在大约15秒后,自动部署过程将开始一次部署一个Web应用程序。 Web应用程序一旦启动就能够提供请求。

您还可以使用startStopThreads让多个线程启动Web应用程序,以便您可以并行启动它们。

从Tomcat开始到第一个Web应用程序启动的15秒延迟是这种方法的缺点。您可以在server.xml中定义一个或多个Web应用程序(通常不推荐),以便它们在Tomcat启动时启动,但您将回到server.xml中定义的任何应用程序都不会出现的问题直到他们都有。