2010-09-09 6 views
5

Ich führe eine Django-Anwendung auf Apache mit mod_wsgi. Wird es während eines Upgrades Ausfallzeiten geben?Ausfallzeit beim Nachladen von mod_wsgi-Daemon?

Mod_wsgi läuft im Daemon-Modus, so dass ich meinen Code durch Berühren der .wsgi-Skriptdatei erneut laden kann, wie im Dokument "ReloadingSourceCode" beschrieben: http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode. Vermutlich benötigt dieses erneute Laden etwas von Null Zeit. Was passiert, wenn während des Reloads eine Anfrage eingeht? Will Apache die Anfrage in die Warteschlange stellen und sie dann vervollständigen, sobald der wsgi-Daemon bereit ist?

Die Dokumentation enthält die folgende Anweisung:

Also, wenn Sie Django im Daemon-Modus verwenden und benötigt, um Ihre ‚settings.py‘ Datei zu ändern, sobald Sie die erforderliche Änderung vorgenommen haben, auch die berühren Skriptdatei, die den WSGI-Anwendungspunkt enthält. Danach wird der Prozess bei der nächsten Anfrage neu gestartet und Ihre Django-Anwendung neu geladen.

Für mich deutet das darauf hin, dass Apache würde jede Anfrage anmutig behandeln, aber ich dachte, ich würde fragen, um sicher zu sein. Meine App ist nicht kritisch (ein kleiner Ausfall wäre nicht katastrophal), also ist die Frage meist akademisch.

Vielen Dank.

Antwort

18

Im Daemon-Modus gibt es kein Konzept für einen anmutigen Neustart, wenn die WSGI-Skriptdatei berührt wird, um einen Download zu erzwingen. Das heißt, im Gegensatz zu Apache selbst, das neue Apache-Server-Child-Prozesse startet, während alte Prozesse auf aktuelle Anfragen warten, muss der bestehende Prozess beendet werden, bevor ein neuer Prozess gestartet wird, für mod_wsgi-Daemon-Prozesse.

Die Folgen davon sind, dass mod_wsgi nicht unbegrenzt auf die aktuellen Anforderungen warten kann. Wenn dies der Fall ist, besteht die Gefahr, dass, wenn alle Daemon-Prozesse gebunden sind und darauf warten, dass aktuelle Anforderungen beendet werden, diese Clients eine merkliche Verzögerung bei der Verarbeitung erfahren.

Am anderen Ende der Skala kann der Daemon-Prozess jedoch nicht sofort beendet werden, da dies dazu führen würde, dass aktuelle Anforderungen unterbrochen werden.

Es gibt also einen Mittelweg. Der Daemon-Prozess wartet darauf, dass Anforderungen vor dem Beenden abgeschlossen werden. Wenn sie jedoch nicht innerhalb des Zeitraums des Herunterfahrens abgeschlossen wurden, wird der Daemon-Prozess zwangsweise beendet und die aktiven Anforderungen werden unterbrochen.

Der Zeitraum dieses Zeitlimits für das Herunterfahren beträgt standardmäßig 5 Sekunden. Sie kann mit der Option "shutdown-timeout" für die WSGIDaemonProcess-Direktive außer Kraft gesetzt werden. Die Auswirkungen einer Änderung sollten jedoch berücksichtigt werden.

In diesem speziellen Fall besteht das Risiko, dass aktive lange Anforderungen unterbrochen werden, wenn Sie lange laufende Anforderungen noch aktiv haben, wenn die erste Anforderung nach dem Berühren der WSGI-Skriptdatei eingeht.

Die nächste bemerkenswerte Sache, die Sie sehen können, ist, dass selbst wenn es keine lange laufenden Anforderungen und Prozesse sofort herunterfahren, dann ist es immer noch notwendig, die WSGI-Anwendung innerhalb des neuen Prozesses wieder zu laden. Die dafür benötigte Zeit wird als Verzögerung bei der Bearbeitung der Anfrage angesehen. Wie groß diese Verzögerung ist, hängt vom Framework und Ihrer Anwendung ab. Der schlimmste Übeltäter, was die Anlaufzeit angeht, von denen ich weiß, ist TurboGears. Django ist etwas besser und die besten bis hin zu schnellen Start-up-Zeiten sind leichte Mikro-Frameworks wie Flask.

Beachten Sie, dass alle neuen Anforderungen, die auftreten, während diese Herunterfahren und Startverzögerungen auftreten, nicht verloren gehen sollten. Dies liegt daran, dass der HTTP-Listener-Socket eine bestimmte Tiefe aufweist und Verbindungen in der Warteschleife stehen, die darauf warten, akzeptiert zu werden. Wenn jedoch die Anzahl der eingehenden Anfragen sehr groß ist und die Warteschlange voll ist, werden im Browser Fehler angezeigt, die die Verbindung ablehnen.

+0

Diese zusätzlichen Hintergrundinformationen sind großartig. Ich hatte nur an neue Anfragen gedacht, nicht an langwierige Voranfragen, aber was Sie beschreiben, macht durchaus Sinn. Vielen Dank. – AndrewF

+1

FWIW, mod_wsgi 4.0 wird mit einigen etwas eleganteren Neuladeoptionen beginnen, sobald diese verfügbar sind. –

1

Nein, es wird keine Ausfallzeiten geben. Anforderungen, die den alten Code verwenden, werden abgeschlossen, und neue Anforderungen verwenden den neuen Code.

Es wird ein wenig mehr Belastung auf dem Server sein, da der neue Code geladen wird, aber wenn Ihre Anwendung kolossal ist und Ihre Server bereits fast überlastet sind, wird dies nicht bemerkt werden.

Dies ist wie der Befehl apachectl graceful für Apache als Ganzes, der es anruft, eine neue Konfiguration ohne Ausfallzeiten zu starten.

+0

Wunderbar, danke. – AndrewF

+0

Verdeckt nicht das ganze Bild. Es kann zu Verzögerungen kommen sowie zu einer Unterbrechung von Anfragen. Siehe meine Antwort. –

Verwandte Themen