我们有一个运行在Tomcat上的Web应用程序(由第三方开发)。我们从应用程序中获得了非常糟糕的性能。应用程序开发人员声称,这是行业最佳实践,它每晚每晚重新启动Web服务器,以释放所有内存使用量并重新开始。
从客户的角度来看,这可以减轻他们白天的网站崩溃问题,但是从SysAdmin的角度来看,这是一个糟糕的解决方案。
我们将这些应用程序的20个托管在不同服务器的不同客户端上,确保每天晚上都重新启动所有这些协调似乎是错误的。
我们有一个运行在Tomcat上的Web应用程序(由第三方开发)。我们从应用程序中获得了非常糟糕的性能。应用程序开发人员声称,这是行业最佳实践,它每晚每晚重新启动Web服务器,以释放所有内存使用量并重新开始。
从客户的角度来看,这可以减轻他们白天的网站崩溃问题,但是从SysAdmin的角度来看,这是一个糟糕的解决方案。
我们将这些应用程序的20个托管在不同服务器的不同客户端上,确保每天晚上都重新启动所有这些协调似乎是错误的。
Answers:
“最佳实践”(很多人出于充分的理由而做的事情)和“常见实践”(许多人因为懒惰和/或无知而做的事情)之间是有区别的。
需要进行常规重新启动或重新启动,继续运行良好的应用程序和(差)的服务器是很常见的。但这也清楚地表明您有一个严重的错误。
通过使其SOP定期重新启动应用程序,您的公司将严重的错误隐藏了起来。这是不可原谅的,需要将bug面朝下并压扁,否则以后会再次咬住您。
理想情况下,您的公司应该找到更好的开发人员。不幸的是,这可能会导致大量的工作来重写大部分代码。开发人员认为编写得不好的代码是可以接受的,或者不知道足以识别错误代码的症状这一事实表明,代码质量低下。好的开发商在宪法上将无能力将其保持在这种状态。
鉴于您可能无法替换开发人员,请提出一些建议:
即使没有使用面向开发人员的性能分析工具,也有许多面向sysadmin的工具可用于性能分析和监视Java应用程序上的内存使用情况。无论如何,您实际上应该在生产服务器上设置内存(特别是堆)的监视。即使您正在运行质量代码,我也建议您这样做。当您的越野车应用即将崩溃时,它可能会提前警告您。
但是更好的是,这些方法应该可以帮助您收集泄漏证明,甚至可以指出应用程序中的问题所在。这样可以为您提供更好的游说弹药,以便对其进行修复。
应用程序开发人员更可能声称通过解决他所做的非专业工作来掩盖自己的屁股符合他的最大利益。他可能没有停止实际承认自己写了一些内存泄漏过大的东西,但距离还很远。
这里的许多答案似乎与实际解决方案脱节。他们似乎避开了教条-永远不要重启服务器-为什么我们要有5个9?容错能力?好吧,这样当他们应该起床时,他们就可以起床。
同样,指出造成不良开发人员或不良开发实践的原因也不是问题的根源。它可以是但并非总是不坏的应用程序代码。这些问题已经内置在许多系统代码中。如果您像我们一样运行许多小型应用程序,则内存泄漏小,Java堆和permgen问题。现代服务器及其运行的软件非常复杂。当您想到像tomcat这样的服务器必须执行的工作-提供文件,处理Web请求,网络通信,数据库通信等时,它的工作量很大。在那个堆栈中,有很多移动部件。
在我看来,主动重启服务器可以说每周或每月一次明智且高效。如果您是集群服务器并且轮换了服务器,则不会对客户端产生一点影响。客户端将对服务器的性能更加满意。
IMO服务器应尽可能少地关闭。App Developer很有可能构建了一个存在内存泄漏的伪劣应用程序。
最好不要重启服务器。这就是我们具有容错能力的原因之一。如果由于应用程序而必须重新启动服务器,则应用程序正在泄漏内存并且构造错误。
我以前使用过Tomcat,但遇到了同样的问题,下次我将使用Java容器时,我将寻找另一个容器,也许是JBoss或GlassFish。
编辑:如果您必须每天晚上重新启动它,那么如果/当负载增加时,您可能不得不更频繁地重新启动它。确保拥有可靠的应用程序,这是最好的解决方案。
我见过最频繁的是每周一次。我现在在哪里,是一家Windows商店,我们在Patch Tuesday之后的周末每月进行一次。