Frage Ist es eine bewährte Praxis, Webserver regelmäßig neu zu starten? [geschlossen]


Wir haben eine Web-Anwendung (von Drittanbietern entwickelt), die auf Tomcat läuft. Wir haben sehr schlechte Leistung von der Anwendung bekommen. Der Anwendungsentwickler behauptet, dass es eine "Best Practice" der Branche sei, jeden Abend Webserver neu zu starten, um die gesamte Speicherbelegung freizusetzen und neu zu beginnen.

Aus der Kundenperspektive, die das Problem der Website-Absturz während des Tages erleichtert, aber aus einer SysAdmin-Perspektive ist es eine schreckliche Lösung.

Wir hosten 20 dieser Anwendungen auf verschiedenen Servern für unterschiedliche Clients, und die Koordination, sicherzustellen, dass alle jeden Abend neu gestartet werden, scheint einfach falsch zu sein.


28
2018-02-03 23:26


Ursprung


Sagen Sie ihnen, dass es das Best Practices der Branche für Anwendungsentwickler ist, ihre Speicherlecks zu finden und zu beheben. - Bart Silverstrim
@Bart Oh Schnapp! - mfinni
+1 nur um meinen Tag zu machen (PS: Ich bin selbst Entwickler) - RN.
Hat er Server oder Dienste gesagt? Wir haben eine Tomcat-Anwendung, die den Dienst jeden Abend neu starten muss. Wenn ich es nicht tue, wird es irgendwann in der Zukunft zum Absturz kommen. Ich würde es lieber nicht machen, aber der Service während des Tages ist wichtiger. - Tubs
Laden Sie einige Logfiles herunter und laden Sie einige JVM-Monitoring-Tools herunter. Wenn während des Tages Abstürze auftreten, sollten Sie Ausnahmen oder etwas protokollieren sehen - selbst wenn es sich um Standardausnahmen handelt. Das gibt Ihnen einen Einblick in die allgemeine Natur des Fehlers. Beachten Sie auch die JVM-Speicherauslastung. Quoten sind wirklich gut, sie haben ein Speicherleck und Sie werden es abfangen, wenn Sie den Server-JVM-Heap beobachten. Bekämpfen Sie schlechte Entwicklung mit guten Systemdaten. Es zerstört die "Du weißt einfach nicht, was du machst" Verteidigung und macht sie tatsächlich für das, warum Dinge vermasselt zu beantworten. - FloppyDisk


Antworten:


Dies ist sicherlich keine bewährte Methode. Während es ist Es ist gut, die Server in regelmäßigen Abständen neu zu starten, nur um sicherzustellen, dass alles korrekt ausgeführt wird und nächtliche Punkte zu einem sehr schwerwiegenden Speicherverlust in der Anwendung neu gestartet werden müssen.


29
2018-02-03 23:30



Das ist ein sehr guter Punkt. Wenn Sie Ihre Server nie wie unten beschrieben neu starten, wissen Sie möglicherweise nicht, dass bestimmte Dienste nicht ordnungsgemäß gestartet werden. Dann, im Falle eines Stromausfalls / harten Neustarts, kommt Ihr Server möglicherweise nicht richtig zurück. - einstiien
+1. Monthly kann sinnvoller sein - nicht nur für einen Neustart, sondern für einen normalen Operationsablauf, um Patches etc. anzuwenden. Ich war einmal Teil eines Admin-Teams für etwa 1500 Server, 24/7, und jeden Monat gab es einen 3-Nächte-Rolling Neustart "geplant, an diesem Punkt würden auch alle Patches usw. auf die Server gestellt werden. Dies bietet Planungssicherheit und eine Standardarbeitsweise. - TomTom


Es gibt einen Unterschied zwischen "Best Practice", Dingen, die viele Menschen aus guten Gründen tun, und "Common Practice", was viele Leute tun, weil sie faul und / oder ignorant sind.

Anwendungen und (noch schlimmer) Server, die routinemäßig neu gestartet oder neu gestartet werden müssen, um weiterhin gut zu funktionieren sind ziemlich häufig. Aber es ist auch ein klares Anzeichen dafür, dass Sie einen kritischen Fehler haben.

Indem Sie es SOP machen, um eine Anwendung regelmäßig neu zu starten, versteckt Ihr Unternehmen einen ernsten Fehler unter dem Teppich. Das ist unentschuldbar, der Käfer muss niedergeschlagen und gequetscht werden, sonst kommt er zurück, um dich später zu beißen.

Idealerweise sollte Ihr Unternehmen einen besseren Entwickler finden. Leider kann dies zu einer Menge Arbeit führen, um große Teile Ihres Codes neu zu schreiben. Die Tatsache, dass der Entwickler entweder denkt, dass schlecht geschriebener Code akzeptabel ist oder nicht genug, um die Symptome von fehlerhaftem Code zu erkennen, deutet darauf hin, dass die Qualität des Codes gering ist. Ein guter Entwickler wird verfassungsrechtlich nicht in der Lage sein, ihn in diesem Zustand zu belassen.

Angesichts der Tatsache, dass Sie möglicherweise nicht in der Lage sind, den Entwickler zu ersetzen, ein paar Vorschläge:

  • Sehen Sie, ob Sie einen besseren Entwickler haben können, der den Code überprüft und seine Bewertung jemandem mitteilt, der etwas dagegen tun kann,
  • Sehen Sie sich Profiling-Tools an. Wenn Sie die Fähigkeiten und / oder Neigung haben, versuchen Sie den Code selbst zu erstellen, um das Leck zu finden und melden Sie es.

Auch ohne in entwicklerorientierte Profiling-Tools zu wechseln, gibt es eine Fülle von Sysadmin-orientierten Tools zum Profilieren und Überwachen der Speichernutzung in Java-Anwendungen. Sie sollten in jedem Fall die Überwachung des Speichers (insbesondere des Heapspeichers) auf Ihren Produktionsservern einrichten. Ich würde dies auch empfehlen, wenn Sie Qualitätscode ausführen würden. Es kann Ihnen eine Warnung geben, wenn Ihre fehlerhaften Apps umkippen.

Aber noch besser, diese sollten Ihnen helfen, den Nachweis zu erbringen, dass ein Leck vorliegt, und möglicherweise sogar angeben, wo das Problem in der Anwendung liegt. Dies wird Ihnen bessere Munition geben, um dafür Lobbyarbeit zu leisten.


12
2017-07-09 16:01



Tatsächlich ist es oft die Infrastruktur, die den Fehler hat und nicht den Code des Entwicklers. Wir hatten mit J2EE-Apps, die regelmäßig auf JBoss in die Hölle der Müllsammlung gehen, keine Probleme, aber auf anderen Comercail-Anwendungsservern funktioniert es gut. Es ist also vielleicht nicht die Schuld des Entwicklers, sondern die Einsatzumgebung. - rmalayter


Der Anwendungsentwickler behauptet eher, dass es in seinem eigenen besten Interesse ist, dass er seinen Arsch bedeckt, indem er seinen unprofessionellen Job bearbeitet. Er hat vielleicht nicht wirklich zugegeben, dass er etwas mit einem riesigen Speicherverlust geschrieben hat, aber nicht sehr weit entfernt.


6
2018-02-04 00:04





Viele Antworten scheinen hier weit von den praktischen Lösungen entfernt zu sein. Sie scheinen Dogma zu vermeiden - Server sollten nie neu gestartet werden - warum haben wir 5 Neunen? Fehlertoleranz? Nun, wenn sie aufstehen sollen, bleiben sie auf.

Auch die Ursache für schlechte Entwickler oder schlechte Entwicklungspraktiken sind nicht die Ursache des Problems. Es kann aber oft sein nicht schlechter Anwendungscode. Diese Probleme sind bereits in viel Systemcode integriert. Kleine Speicherverluste, Java-Heap- und Permgen-Probleme, wenn Sie wie wir viele kleine Apps ausführen. Moderne Server und die von ihnen betriebene Software sind sehr komplex. Wenn Sie daran denken, was ein Server wie Tomcat zu tun hat - Dateien zu bedienen, Web-Anfragen, Netzwerk-Kommunikation, Datenbank-Kommunikation, etc. zu verarbeiten, tut es sehr viel. In diesem Stapel steckt eine Menge beweglicher Teile.

Der proaktive Neustart von Servern, sagen wir einmal pro Woche oder Monat, ist aus meiner Sicht klug und effizient. Wenn Sie gruppiert sind und die Server rotieren, sollten Sie die Clients nicht ein Bit beeinflussen. Die Kunden werden mit der Leistung Ihrer Server viel zufriedener sein.


3
2017-10-31 13:37





IMO Server sollten so wenig wie möglich heruntergefahren werden. Es ist wahrscheinlicher, dass der App-Entwickler eine schlimme Anwendung mit einem Speicherleck erstellt hat.


2
2018-02-03 23:29



Absolut - ich denke, das OP muss jemandem sagen, dass sie einen besseren Entwickler finden müssen. - Helvick
Es gibt einen Grund, warum große Unternehmen viel Geld für mehrere Upgrades ausgeben und warum Unternehmen Tausende für redundante Netzteile, RAID, Hot-Swap-Cages usw. ausgeben, und es ist sicherlich nicht so, dass sie nur einmal am Tag neu starten müssen. - Bart Silverstrim


Ich habe jeden Abend ein Skript, um einen unserer Webserver neu zu starten, aber das liegt eher an einer schlecht geschriebenen Java-Anwendung als an einem Industriestandard. Ich würde sagen, dass es nicht ungewöhnlich ist, die Webdienste jedoch neu zu starten. Dies könnte die gesuchte Speicherbereinigung bewirken und den Server im Vergleich zu einem vollständigen Neustart weniger belasten.


1
2018-02-03 23:31





Ein Server sollte vorzugsweise noch nie neu gestartet werden. Das ist einer der Gründe, warum wir es getan haben Fehlertoleranz. Wenn Sie Ihren Server aufgrund Ihrer Anwendungen neu starten müssen, verlieren Ihre Anwendungen Speicher und sind schlecht aufgebaut.

Ich habe vorher mit Tomcat gearbeitet, und ich hatte das gleiche Problem, wenn ich das nächste Mal mit einem Java-Container arbeiten werde, suche ich nach einem anderen, vielleicht JBoss oder GlassFish.

Bearbeiten: Wenn Sie es jetzt jeden Abend neu starten müssen, müssen Sie es wahrscheinlich öfter neu starten, wenn / wenn die Last zunimmt. Achten Sie darauf, solide Anwendungen zu haben, das ist die beste Lösung.


1
2018-02-03 23:40



Ich glaube nicht, dass ich zustimme, wenn Sie sagen, dass ein Server nie neu gestartet werden sollte. Server sollten neu gestartet werden, um Sicherheitsupdates anzuwenden. Sie sollten nie für andere als geplante Wartungsarbeiten neu gestartet werden müssen. - Zoredache
Es stimmt, dass einige Server neu gestartet werden müssen, um Sicherheitsupdates anzuwenden. Aber wenn Sie ein System haben, das gut genug ist, müssen Sie das System nicht neu starten. Es gibt Systeme, die Jahr für Jahr laufen. Sie sollten auf hohe Verfügbarkeit abzielen, wenn Sie einen Dienst im Internet bereitstellen. Wenn Sie ein fehlertolerantes System wie einen Cluster haben, können Sie die Knoten nacheinander entfernen und aktualisieren, wenn der Dienst noch läuft. - Jonas
Wenn Sie nur einen einzelnen Server und / oder Hardware haben, gibt es keine Hochverfügbarkeit. Sie tun es falsch, wenn Sie nur einen Server angegeben haben und Ihr Service so kritisch ist, dass er nicht immer 15 Minuten Ausfallzeit tolerieren kann, um den Server neu zu starten. Wenn Sie eine "Null-Ausfallzeit" -Anwendung haben, dann Sie werden Habe ein echtes HA-System mit mehreren Knoten. In diesem Fall ist ein regelmäßiger Neustart für Patches usw. ziemlich einfach, wie Sie darauf hingewiesen haben. - EEAA
"Nächstes Mal ... werde ich nach einem anderen [Java-Container außer Tomcat] suchen". Ich würde Tomcat nicht die Schuld geben. Ich betreibe seit Jahren Produktionsdienste und jedes Mal, wenn ich dieses Problem hatte, stellte sich heraus, dass es sich um ein Anwendungsproblem handelte. "Achten Sie darauf, solide Anwendungen zu haben, das ist die beste Lösung" Genau. Lustigerweise hat jeder andere Java-Anwendungsserver, den ich bisher benutzt habe, ähnliche Probleme, wenn ich undichten Code darauf laufen lasse. Das heißt, Tomcat 7 soll eine Art proaktive Speicherleckerkennung haben. - Kief


Die häufigste, die ich je gesehen habe, ist wöchentlich. Wo ich jetzt bin, sind wir ein Windows-Shop, und wir machen es monatlich am Wochenende nach dem Patch-Dienstag.


0
2018-04-21 19:49



Als ich anfing, an einem Ort zu arbeiten, stellte ich fest, dass sie nächtliche Neustarts an Ort und Stelle hatten ... Das war schrecklich, besonders da der Server eine Chance von 1-2% hatte, nicht richtig wieder zu kommen (Timing Bug im Festplattentreiber) ). Es dauerte einige Zeit, um die "Ursachen" für die Neustarts zu beheben. Zeit gut verbracht. - Brian Knoblauch


Obwohl ich zustimme, dass es nicht ideal ist, einen Server ständig neu zu starten, gibt es Situationen, in denen weder der Entwickler noch der falsche Entwickler etwas zu tun hat. Wir haben eine gut ertragene Anwendung, die aufgrund von Problemen in der Python Popen-Bibliothek Speicher verliert. Es ist eine alte Anwendung, die bald in den Ruhestand geht, aber sie ist geschäftskritisch. Wir müssen es mit einem Minimum an Aufwand für unsere Kunden laufen lassen. Also haben wir beschlossen, den Server jede Nacht neu zu starten.


0
2017-07-23 04:00