定期重新启动Web服务器是否是最佳行业做法?[关闭]


28

我们有一个运行在Tomcat上的Web应用程序(由第三方开发)。我们从应用程序中获得了非常糟糕的性能。应用程序开发人员声称,这是行业最佳实践,它每晚每晚重新启动Web服务器,以释放所有内存使用量并重新开始。

从客户的角度来看,这可以减轻他们白天的网站崩溃问题,但是从SysAdmin的角度来看,这是一个糟糕的解决方案。

我们将这些应用程序的20个托管在不同服务器的不同客户端上,确保每天晚上都重新启动所有这些协调似乎是错误的。


41
告诉他们这是应用程序开发人员查找并修复其内存泄漏的行业最佳实践。
Bart Silverstrim'2

4
@巴特
mfinni

1
+1只是为了让自己过得好(PS:我本人是开发人员)
RN。

1
他是说服务器还是服务?我们有一个tomcat应用程序,需要该服务每晚重新启动。如果我不这样做,将来它会崩溃。我宁愿不这样做,但白天的服务更为重要。
浴缸

1
进行一些日志文件监视,并下载一些JVM监视工具。如果白天东西崩溃了,即使是默认例外,您也应该会看到例外或正在记录的内容。这将使您对错误的一般性质有所了解。另外,请注意JVM内存使用情况。奇数非常好,它们有内存泄漏,如果您观看服务器JVM堆,就会发现它。使用良好的sysadmin数据应对不良的开发。它破坏了“你只是不知道自己在做什么”的防御,使他们实际上不得不为事情搞砸的原因做出回答。
软盘

Answers:


29

这当然不是最佳实践。虽然这很好的重新启动服务器定期只是为了确保一切正常出现,需要重新启动夜间点到应用程序中的非常严重的内存泄露。


1
这是非常好的一点。如果您从未按照以下建议重新启动服务器,则可能不知道您有某些服务无法正常启动。然后,在电源故障/硬重启的情况下,服务器可能无法正确恢复。
einstiien

1
+1。每月可能更有意义-不仅是重新启动,而且是用于应用补丁程序的正常操作过程,等等。我曾经是管理团队的一员,负责大约1500台服务器(24/7),每个月进行3夜的滚动重新启动”,届时所有补丁等也将被放入服务器。这可以提供一些计划稳定性和标准的操作程序。
TomTom

12

“最佳实践”(很多人出于充分的理由而做的事情)和“常见实践”(许多人因为懒惰和/或无知而做的事情)之间是有区别的。

需要进行常规重新启动或重新启动,继续运行良好的应用程序和(差)的服务器很常见的。但这也清楚地表明您有一个严重的错误。

通过使其SOP定期重新启动应用程序,您的公司将严重的错误隐藏了起来。这是不可原谅的,需要将bug面朝下并压扁,否则以后会再次咬住您。

理想情况下,您的公司应该找到更好的开发人员。不幸的是,这可能会导致大量的工作来重写大部分代码。开发人员认为编写得不好的代码是可以接受的,或者不知道足以识别错误代码的症状这一事实表明,代码质量低下。好的开发商在宪法上将无能力将其保持在这种状态。

鉴于您可能无法替换开发人员,请提出一些建议:

  • 看看您是否可以让更好的开发人员查看代码并将其评估报告给可以对此做些事情的人,
  • 看一下分析工具。如果您有技能和/或意愿,请尝试自己对代码进行性能分析,以发现泄漏并报告。

即使没有使用面向开发人员的性能分析工具,也有许多面向sysadmin的工具可用于性能分析和监视Java应用程序上的内存使用情况。无论如何,您实际上应该在生产服务器上设置内存(特别是堆)的监视。即使您正在运行质量代码,我也建议您这样做。当您的越野车应用即将崩溃时,它可能会提前警告您。

但是更好的是,这些方法应该可以帮助您收集泄漏证明,甚至可以指出应用程序中的问题所在。这样可以为您提供更好的游说弹药,以便对其进行修复。


2
实际上,很多时候是有错误的基础结构,而不是开发人员的代码。对于定期在JBoss上进入垃圾回收地狱但在其他商用应用程序服务器上可以正常工作的J2EE应用程序,我们没有任何麻烦。因此,这可能不是开发人员的错,而是部署环境。
rmalayter 2011年

6

应用程序开发人员更可能声称通过解决他所做的非专业工作来掩盖自己的屁股符合他的最大利益。他可能没有停止实际承认自己写了一些内存泄漏过大的东西,但距离还很远。


3

这里的许多答案似乎与实际解决方案脱节。他们似乎避开了教条-永远不要重启服务器-为什么我们要有5个9?容错能力?好吧,这样当他们应该起床时,他们就可以起床。

同样,指出造成不良开发人员或不良开发实践的原因也不是问题的根源。它可以是但并非总是不坏的应用程序代码。这些问题已经内置在许多系统代码中。如果您像我们一样运行许多小型应用程序,则内存泄漏小,Java堆和permgen问题。现代服务器及其运行的软件非常复杂。当您想到像tomcat这样的服务器必须执行的工作-提供文件,处理Web请求,网络通信,数据库通信等时,它的工作量很大。在那个堆栈中,有很多移动部件。

在我看来,主动重启服务器可以说每周或每月一次明智且高效。如果您是集群服务器并且轮换了服务器,则不会对客户端产生一点影响。客户端将对服务器的性能更加满意。


2

IMO服务器应尽可能少地关闭。App Developer很有可能构建了一个存在内存泄漏的伪劣应用程序。


绝对-我认为OP必须告诉某人他们需要寻找更好的开发人员。
赫尔维克,2010年

2
大公司有理由为多个正常运行时间支付大笔费用,还有为什么公司要在冗余电源,RAID,热插拔笼等上花费数千美元,这当然不是因为他们每天只需要重启一次就可以了。
Bart Silverstrim'Feb

1

我有一个脚本每晚每晚重新启动我们的一个Web服务器,但这更多是因为Java应用程序编写不佳,而不是行业标准。我想说,重新启动Web服务并不罕见。与完全重新启动相比,这可能会进行所需的内存清理,并减轻了服务器的负担。


1

最好不要重启服务器。这就是我们具有容错能力的原因之一。如果由于应用程序而必须重新启动服务器,则应用程序正在泄漏内存并且构造错误。

我以前使用过Tomcat,但遇到了同样的问题,下次我将使用Java容器时,我将寻找另一个容器,也许是JBoss或GlassFish。

编辑:如果您必须每天晚上重新启动它,那么如果/当负载增加时,您可能不得不更频繁地重新启动它。确保拥有可靠的应用程序,这是最好的解决方案。


4
当您说永远不要重启服务器时,我认为我不同意。应该重新启动服务器以应用安全修复程序。但是,除了计划内的维护之外,它们永远不需要重新启动。
Zoredache

确实,必须重新启动某些服务器才能应用安全修复程序。但是,如果您有足够好的系统,则不必重新启动系统。它存在年复一年运行的系统。如果要在Internet上提供服务,则应追求高可用性。如果您拥有像群集这样的容错系统,则可以在服务仍在运行时逐个删除节点并更新它们。
乔纳斯(Jonas)2010年

1
如果只有一台服务器和/或一块硬件,则没有高可用性之类的东西。如果您仅提供一台服务器,并且您的服务非常关键,以至于无法容忍15分钟的停机时间来重新启动服务器,那么您做错了。如果您确实有一个“零停机时间”应用程序,那么您拥有一个具有多个节点的真正的HA系统。在这种情况下,如您所指出的,定期重新启动补丁程序等非常容易。
EEAA 2010年

1
“下一次……我将寻找另一个[Tomcat以外的Java容器]”。我不会怪Tomcat。我一直在其上运行生产服务,并且每次遇到此问题时,它实际上都是应用程序问题。确实,“确保有可靠的应用程序,这是最好的解决方案”。有趣的是,到目前为止,我使用的所有其他Java应用程序服务器在运行泄漏代码时都会遇到类似的问题。就是说,Tomcat 7应该具有某种主动内存泄漏检测功能。
基夫2010年

0

我见过最频繁的是每周一次。我现在在哪里,是一家Windows商店,我们在Patch Tuesday之后的周末每月进行一次。


当我开始在一个地方工作时,我发现他们每晚进行一次重新启动……这太可怕了,尤其是因为服务器大约有1-2%的机会无法正确恢复(定时驱动器中的错误) )。花了一些时间来解决重新启动的“原因”。花费的时间。
Brian Knoblauch

0

尽管我同意不断重启服务器并不理想,但在某些情况下,开发人员既不是错事也不是错事。由于Python Popen库中的问题,我们有一个行为正常的应用程序正在泄漏内存。这是一个将很快淘汰的旧应用程序,但它对业务至关重要。我们必须为客户保持最小的忙碌状态。因此,我们刚刚决定每晚重新启动服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.