Tomcat 上的战争部署需要很长时间
Posted
技术标签:
【中文标题】Tomcat 上的战争部署需要很长时间【英文标题】:War deployment on Tomcat takes ages 【发布时间】:2010-12-19 21:57:05 【问题描述】:我有一个 Grails 应用程序,构建为一个 war 文件 (~30mb)。当我尝试通过应用程序管理器在 Tomcat 6 上部署 war 文件时,部署需要 10 分钟以上,或者无限期挂起。当它挂起时,我可以重新启动 Tomcat 并且通常会部署该应用程序,但有时我必须重复该过程。我还注意到,在部署过程中,Java 进程会最大限度地使用 CPU,而 RAM 大约为 10-15%。
我对 Java 还很陌生,所以我不知道这是否正常,但我无法想象会是怎样。我能做些什么来让这个运行更顺畅/更快吗?有没有比Tomcat的应用管理器更好的部署方式?
【问题讨论】:
查看tomcat日志(tomcat/logs/) 【参考方案1】:我将 WAR 上传到我的主目录,cd 到 /usr/local/tomcat,然后运行以下命令:
bin/shutdown.sh
rm webapps/ROOT.war
rm -rf webapps/ROOT
cp ~/ROOT.war webapps
bin/startup.sh
【讨论】:
这些似乎是要走的路。直接从 webapps 文件夹部署只需要一两分钟。回复:热部署,我发现热部署后系统有点卡顿,所以关闭、部署、启动策略似乎是最好的。谢谢! 关于热部署的另一个注意事项,由于 CPU 使用率为 100%,实时应用程序无论如何都完全无法使用,因此在部署期间保持 Tomcat 在线几乎没有什么好处。【参考方案2】:一定要检查 Tomcat 日志中是否有任何错误/警告。
您可能在ServletContextListener
s 之一中有一些昂贵/敏感的代码逻辑。它们通常在启动期间初始化。如果是这样,那么我会针对任何性能问题/泄漏对其进行调试/分析。
【讨论】:
【参考方案3】:如前所述,我会将战争复制到 webapps 文件夹并让 tomcat 进行部署,这也可以更快地节省您的时间。
Tomcat 和 Jetty 都将支持热部署。他们只是监视部署目录的更改,因此您只需将 .war 文件复制到该目录中,服务器就会取消部署/重新部署。
如果使用远程服务器,请检查延迟不是通过网络将战争上传到远程服务器所需的时间。
【讨论】:
【参考方案4】:不要使用应用程序管理器。我的方法是将它上传到 webapps 目录之外的某个地方,然后将其复制到 webapps 目录。部署时间大大减少。
【讨论】:
如果应用服务器在所有文件(相关类本身)被复制之前开始加载你的webapp,它不会发生冲突吗? 我复制的是war文件,不是解压文件。【参考方案5】:您并不总是有足够的访问权限来手动将文件放入webapps
文件夹——您应该使用 Tomcat 应用程序管理器进行.war
文件部署,并且需要使其工作。
对我来说,将.war
文件上传到服务器的过程无法完成是很常见的;它卡在中间的某个地方,并且无论我重试多少次,文件都只是部分上传到服务器。在这种情况下,我发现尝试其他浏览器是值得的。例如,我发现自己一直在使用谷歌浏览器,但一旦我切换到新启动的 Firefox 浏览器,事情就解决了。
【讨论】:
部署帐户的超级用户权限可以为您创造奇迹。直接复制到文件系统比使用 Tomcat 管理界面快得多【参考方案6】:这可能与BUG of JDK有关
我阅读了this article, Tomcat7 starts too late on Ubuntu 14.04 x64 并解决了我的问题。
尝试通过替换
来解决它securerandom.source=file:/dev/urandom
与
securerandom.source=file:/dev/./urandom
在$JAVA_PATH/jre/lib/security/java.security
【讨论】:
以上是关于Tomcat 上的战争部署需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jenkins 将战争文件部署到 Tomcat 的推荐方法?