Ist es eine Best-Industry-Praxis, Webserver regelmäßig neu zu starten? [geschlossen]


28

Wir haben eine Webanwendung (von einem Drittanbieter entwickelt), die auf Tomcat ausgeführt wird. Die Anwendung hat eine sehr schlechte Leistung erbracht. Der Anwendungsentwickler gibt an, dass es eine bewährte Methode der Branche ist, Webserver jede Nacht neu zu starten, um die gesamte Speichernutzung freizugeben und von vorne zu beginnen.

Aus der Sicht der Kunden, die das Problem des Absturzes der Site während des Tages lindert, ist dies jedoch aus Sicht von SysAdmin eine schreckliche Lösung.

Wir hosten 20 dieser Anwendungen auf verschiedenen Servern für verschiedene Clients, und die Koordination, sicherzustellen, dass alle Anwendungen jede Nacht neu gestartet werden, scheint einfach falsch.


41
Sagen Sie ihnen, dass es für Anwendungsentwickler eine bewährte Methode der Branche ist, Speicherlecks zu finden und zu beheben.
Bart Silverstrim

4
@ Bart Oh Schnappschuss !!
Mfinni

1
+1 nur für meinen Tag (PS: Ich bin selbst Entwickler)
RN.

1
Sagte er Server oder Dienste? Wir haben eine Tomcat-Anwendung, bei der der Dienst jede Nacht neu gestartet werden muss. Wenn ich es nicht mache, wird es irgendwann in der Zukunft abstürzen. Ich würde es lieber nicht tun, aber der Service während des Tages ist wichtiger.
Tubs

1
Starten Sie eine Protokolldateiüberwachung und laden Sie einige JVM-Überwachungstools herunter. Wenn Dinge während des Tages abstürzen, sollten Ausnahmen angezeigt oder etwas protokolliert werden - auch wenn es sich um Standardausnahmen handelt. Das gibt Ihnen einen Einblick in die allgemeine Natur des Fehlers. Beobachten Sie auch die JVM-Speichernutzung. Die Chancen stehen gut, dass ein Speicherleck vorliegt, und Sie werden es bemerken, wenn Sie den JVM-Haufen des Servers beobachten. Bekämpfe schlechte Entwicklung mit guten Sysadmin-Daten. Es zerstört die Verteidigung "Du weißt einfach nicht, was du tust" und bringt sie dazu, sich tatsächlich dafür verantworten zu müssen, warum die Dinge durcheinander geraten sind.
FloppyDisk

Antworten:


29

Dies ist sicherlich keine bewährte Methode. Während es ist gut Ihre Server in regelmäßigen Abständen neu zu starten , nur um sicherzustellen , dass alles richtig aufkommt, um nächtliche Punkte zu einem sehr ernsten Speicherverlust in der Anwendung neu zu starten.


1
Das ist ein sehr guter Punkt. Wenn Sie Ihre Server nicht wie unten vorgeschlagen neu starten, wissen Sie möglicherweise nicht, dass bestimmte Dienste nicht ordnungsgemäß gestartet werden. Im Falle eines Stromausfalls oder eines Hard-Neustarts wird der Server möglicherweise nicht ordnungsgemäß wiederhergestellt.
einstiien

1
+1. Monatlich ist möglicherweise sinnvoller - nicht nur für einen Neustart, sondern auch für einen normalen Vorgang zum Anwenden von Patches usw. Ich war einmal Teil eines Admin-Teams für ungefähr 1500 Server, 24/7, und jeden Monat gab es ein 3-Nächte-Rolling "Neustart" geplant, zu welchem ​​Zeitpunkt auch alle Patches etc. auf den Servern abgelegt würden. Dies sichert eine gewisse Planungsstabilität und eine Standardarbeitsweise.
TomTom

12

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

Anwendungen und (schlechtere) Server, die routinemäßig neu gestartet oder neu gestartet werden müssen, um einen reibungslosen Betrieb zu gewährleisten, sind weit verbreitet. Es ist aber auch ein klarer Hinweis darauf, dass Sie einen kritischen Fehler haben.

Indem Sie dafür sorgen, dass eine Anwendung regelmäßig neu gestartet wird, verbirgt Ihr Unternehmen einen schwerwiegenden Fehler unter dem Teppich. Dies ist unentschuldbar. Der Fehler muss behoben werden, sonst kommt er zurück, um Sie später zu beißen.

Idealerweise sollte Ihr Unternehmen einen besseren Entwickler finden. Leider kann dies zu ziemlich viel Arbeit führen, um große Teile Ihres Codes neu zu schreiben. Die Tatsache, dass der Entwickler schlecht geschriebenen Code entweder für akzeptabel hält oder nicht genug weiß, um die Symptome von fehlerhaftem Code zu erkennen, legt nahe, dass die Qualität des Codes niedrig ist. Ein guter Entwickler wird verfassungsmäßig nicht in der Lage sein, ihn in diesem Zustand zu belassen.

Da Sie möglicherweise nicht in der Lage sind, den Entwickler zu ersetzen, einige Vorschläge:

  • Finden Sie heraus, ob ein besserer Entwickler den Code überprüfen und seine Bewertung an jemanden melden kann, der etwas dagegen tun kann.
  • Schauen Sie sich die Profilerstellungs-Tools an. Wenn Sie die Fähigkeiten und / oder Neigung haben, versuchen Sie, den Code selbst zu profilieren, um das Leck zu finden und es zu melden.

Auch ohne auf entwicklerorientierte Profilerstellungstools zuzugreifen, gibt es zahlreiche sysadmin-orientierte Tools für die Profilerstellung und Überwachung der Speichernutzung in Java-Anwendungen. Sie sollten auf jeden Fall die Überwachung des Arbeitsspeichers (insbesondere des Heapspeichers) auf Ihren Produktionsservern einrichten. Ich würde dies empfehlen, auch wenn Sie Qualitätscode ausgeführt haben. Sie erhalten möglicherweise eine Vorwarnung, wenn Ihre fehlerhaften Apps umkippen.

Besser noch: Sie können anhand dieser Informationen nachweisen, dass ein Leck vorliegt, und möglicherweise sogar angeben, wo sich das Problem in der Anwendung befindet. Dadurch erhalten Sie bessere Munition für die Lobby, damit diese repariert wird.


2
Tatsächlich ist es oft die Infrastruktur, die den Fehler aufweist, und nicht der Code des Entwicklers. Wir hatten keine Probleme mit J2EE-Apps, die regelmäßig auf JBoss in die Müllsammlung gehen, aber auf anderen Commercail-Anwendungsservern einwandfrei funktionieren. Es liegt also möglicherweise nicht am Entwickler, sondern an der Implementierungsumgebung.
Malayter

6

Der Anwendungsentwickler behauptet mit größerer Wahrscheinlichkeit, dass es in seinem eigenen Interesse liegt, seinen Arsch zu bedecken, indem er seine unprofessionelle Arbeit erledigt. Vielleicht hat er aufgehört zuzugeben, dass er etwas mit einem unglaublichen Speicherleck geschrieben hat, aber nicht sehr weit davon entfernt.


3

Viele Antworten scheinen hier von praktischen Lösungen abzuweichen. Sie scheinen Dogmen zu meiden - Server sollten niemals neu gestartet werden - warum haben wir 5 Neunen? Fehlertoleranz? Nun, das ist so, wenn sie auf sein sollen, bleiben sie auf.

Auch die Ursache für schlechte Entwickler oder schlechte Entwicklungspraktiken zu nennen, geht nicht an die Wurzel des Problems. Es kann aber meistens sein, dass sein Anwendungscode nicht schlecht ist. Diese Probleme sind bereits in einem Großteil des Systemcodes enthalten. Kleine Speicherverluste, Java-Heap und Permgen-Probleme, wenn Sie wie wir viele kleine Apps ausführen. Moderne Server und die Software, die sie ausführen, sind sehr komplex. Wenn Sie überlegen, was ein Server wie Tomcat tun muss - Dateien bereitstellen, Webanforderungen verarbeiten, Netzwerkkommunikation, Datenbankkommunikation usw. - dann ist das eine Menge. In diesem Stapel gibt es eine Menge beweglicher Teile.

Das proaktive Neustarten von Servern, beispielsweise einmal pro Woche oder Monat, ist meiner Ansicht nach intelligent und effizient. Wenn Sie gruppiert sind und die Server rotieren, sollten Sie die Clients nicht ein bisschen beeinflussen. Kunden sind mit der Leistung Ihrer Server viel zufriedener.


2

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


Absolut - ich denke, das OP muss jemandem sagen, dass er einen besseren Entwickler finden muss.
Helvick

2
Es gibt einen Grund, warum große Unternehmen viel Geld für mehrere Neunen Betriebszeit zahlen und warum Unternehmen Tausende für redundante Netzteile, RAID, Hot-Swap-Käfige usw. ausgeben, und es ist sicherlich nicht so, dass sie nur einmal am Tag neu starten müssen.
Bart Silverstrim

1

Ich habe jeden Abend ein Skript, das einen unserer Webserver neu startet, 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 neu zu starten. Dies kann die gesuchte Speicherbereinigung bewirken und den Server im Vergleich zu einem vollständigen Neustart weniger belasten.


1

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

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

Bearbeiten: Wenn Sie es jetzt jede Nacht neu starten müssen, müssen Sie es wahrscheinlich häufiger neu starten, wenn / wenn die Last steigt. Stellen Sie sicher, dass Sie solide Anwendungen haben, das ist die beste Lösung.


4
Ich glaube nicht, dass ich damit einverstanden bin, wenn Sie sagen, dass ein Server niemals neu gestartet werden sollte. Server sollten neu gestartet werden, um Sicherheitsupdates anzuwenden. Sie sollten jedoch niemals für andere als geplante Wartungsarbeiten neu gestartet werden müssen.
Zoredache

Es ist richtig, dass einige Server neu gestartet werden müssen, um Sicherheitsupdates anzuwenden. Wenn Sie jedoch ein ausreichend gutes System haben, müssen Sie das System nicht neu starten. Es gibt Systeme, die Jahr für Jahr laufen. Sie sollten Hochverfügbarkeit anstreben, wenn Sie einen Dienst im Internet bereitstellen. Wenn Sie ein fehlertolerantes System wie einen Cluster haben, können Sie die Knoten einzeln herunterfahren und aktualisieren, wenn der Dienst noch ausgeführt wird.
Jonas

1
Wenn Sie nur einen Server und / oder Hardware haben, gibt es keine Hochverfügbarkeit. Sie machen es falsch, wenn Sie nur einen Server angegeben haben und Ihr Dienst so kritisch ist, dass er nicht ab und zu 15 Minuten Ausfallzeit toleriert, um den Server neu zu starten. Wenn Sie eine „Null - Ausfallzeit“ Anwendung zu tun haben, dann Sie werden ein wahres HA - System mit mehreren Knoten haben. In diesem Fall ist ein regelmäßiger Neustart für Patches usw. recht einfach, wie Sie bereits betont haben.
EEAA,

1
Msgstr "Nächstes Mal ... werde ich nach einem anderen [Java - Container als Tomcat] suchen". Ich würde Tomcat nicht die Schuld geben. Ich habe jahrelang Produktionsservices ausgeführt, und jedes Mal, wenn ich dieses Problem hatte, stellte sich heraus, dass es sich um ein Anwendungsproblem handelt. "Stellen Sie sicher, dass Sie solide Anwendungen haben, das ist die beste Lösung." Genau. Lustigerweise leidet jeder andere Java-Anwendungsserver, den ich bisher verwendet habe, unter ähnlichen Problemen, wenn ich auf ihm undichten Code ausführe. Trotzdem soll Tomcat 7 eine Art proaktive Speicherleckerkennung haben.
Kief

0

Das häufigste, das ich je gesehen habe, ist wöchentlich. Wo ich gerade bin, sind wir ein Windows-Shop und machen das monatlich über das Wochenende nach Patch Tuesday.


Als ich anfing, an einem Ort zu arbeiten, stellte ich fest, dass nächtliche Neustarts stattfanden ... Das war schrecklich, zumal der Server mit einer Wahrscheinlichkeit von 1-2% nicht wieder richtig hochkam (Timing-Fehler im Festplattentreiber) ). Es dauerte einige Zeit, um die "Ursachen" für die Neustarts zu beheben. Zeit gut verbracht.
Brian Knoblauch

0

Ich bin damit einverstanden, dass es nicht ideal ist, einen Server ständig neu zu starten, aber es gibt Situationen, in denen weder der Entwickler noch das Falsche schuld sind. Wir haben eine gut erzogene Anwendung, bei der aufgrund von Problemen in der Python Popen-Bibliothek Speicherplatz verloren geht. Es ist eine alte Anwendung, die bald eingestellt wird, aber geschäftskritisch ist. Wir müssen es mit einem Minimum an Aufwand für unsere Kunden am Laufen halten. Deshalb haben wir uns entschieden, den Server jede Nacht neu zu starten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.