Tomcat 启动性能:如何防止等待所有 Web 应用程序部署完毕?
Tomcat startup performance : How to prevent waiting until all webapps are deployed?
我们的应用程序中有 20 场战争,我遇到了一个我无法解决的问题。
我们有两个Tomcat部署案例:
开始后复制神器
当您在 Tomcat 已经启动时复制您的 wars 时,您可以调用在所有应用程序启动和 运行 之前已经启动的应用程序。
开始前复制神器
当您在 Tomcat 尚未启动时复制您的 wars 时,您将无法调用应用程序,直到所有应用程序都已启动且 运行。
是否有可能配置Tomcat以防止等待所有战争部署到第二种情况?
提前致谢。
默认 Tomcat 配置将使应用程序部署看起来像无政府状态,但有一种方法可以通过按定义的顺序启动应用程序来提供更可预测的行为。您仍然必须等待应用程序在响应请求之前部署完毕,但至少如果其中一个需要首先加载,您可以为它提供应有的优先级。有趣的是,阅读 Tomcat startup documentation 并没有提供任何线索。
为实现这一点,您可以实施与您拥有的应用程序一样多的 Services/Connectors/Engines/Hosts。如果您希望所有这些都在同一个端口上应答,也许您需要在前面加上一个 reverse-proxy。每个应用程序都将部署在自己的目录中,而不是 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)上的 before/after 结果:
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 建议,non-compressed 战争会加速部署,我同意。也许你可以用它赢得 10%-15% 的启动时间。
编辑 3
至于上面的两个编辑,另一个参数可以帮助您加快启动速度:主机定义中的 startStopThreads
默认为 1。将其调整为您拥有的 cpus 数量,在我使用 6 vcpus 的测试中它是在用户邮件列表中使用 1000 sample wars to deploy. This point was 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但是有点弱
保留 autoDeploy="true"
,但为 server.xml
中的 <Host>
元素设置 deployOnStartup="false"
。 Tomcat 将在没有任何 Web 应用程序的情况下启动,然后在约 15 秒后自动部署过程将开始一次部署一个 Web 应用程序。 Web 应用程序将能够在启动后立即处理请求。
您还可以使用 startStopThreads
让多个线程启动 Web 应用程序,这样您就可以并行启动它们。
从 Tomcat 开始到第一个 Web 应用程序启动的 15 秒延迟是这种方法的缺点。您可以在 server.xml
中定义一个或多个 Web 应用程序(通常不推荐),以便它们在 Tomcat 启动时启动,但随后您将回到 none 中定义的应用程序的问题server.xml
将在全部可用之前可用。
我们的应用程序中有 20 场战争,我遇到了一个我无法解决的问题。
我们有两个Tomcat部署案例:
开始后复制神器
当您在 Tomcat 已经启动时复制您的 wars 时,您可以调用在所有应用程序启动和 运行 之前已经启动的应用程序。开始前复制神器 当您在 Tomcat 尚未启动时复制您的 wars 时,您将无法调用应用程序,直到所有应用程序都已启动且 运行。
是否有可能配置Tomcat以防止等待所有战争部署到第二种情况?
提前致谢。
默认 Tomcat 配置将使应用程序部署看起来像无政府状态,但有一种方法可以通过按定义的顺序启动应用程序来提供更可预测的行为。您仍然必须等待应用程序在响应请求之前部署完毕,但至少如果其中一个需要首先加载,您可以为它提供应有的优先级。有趣的是,阅读 Tomcat startup documentation 并没有提供任何线索。
为实现这一点,您可以实施与您拥有的应用程序一样多的 Services/Connectors/Engines/Hosts。如果您希望所有这些都在同一个端口上应答,也许您需要在前面加上一个 reverse-proxy。每个应用程序都将部署在自己的目录中,而不是 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)上的 before/after 结果:
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 建议,non-compressed 战争会加速部署,我同意。也许你可以用它赢得 10%-15% 的启动时间。
编辑 3
至于上面的两个编辑,另一个参数可以帮助您加快启动速度:主机定义中的 startStopThreads
默认为 1。将其调整为您拥有的 cpus 数量,在我使用 6 vcpus 的测试中它是在用户邮件列表中使用 1000 sample wars to deploy. This point was 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但是有点弱
保留 autoDeploy="true"
,但为 server.xml
中的 <Host>
元素设置 deployOnStartup="false"
。 Tomcat 将在没有任何 Web 应用程序的情况下启动,然后在约 15 秒后自动部署过程将开始一次部署一个 Web 应用程序。 Web 应用程序将能够在启动后立即处理请求。
您还可以使用 startStopThreads
让多个线程启动 Web 应用程序,这样您就可以并行启动它们。
从 Tomcat 开始到第一个 Web 应用程序启动的 15 秒延迟是这种方法的缺点。您可以在 server.xml
中定义一个或多个 Web 应用程序(通常不推荐),以便它们在 Tomcat 启动时启动,但随后您将回到 none 中定义的应用程序的问题server.xml
将在全部可用之前可用。