Frage

Meine RubyOnRails-App ist mit dem üblichen Mischlingspaket hinter der Apache-Konfiguration eingerichtet.Wir haben festgestellt, dass die Speicherauslastung unseres Mongrel-Webservers bei bestimmten Vorgängen sehr stark ansteigen kann, und wir möchten wirklich jederzeit einen ordnungsgemäßen Neustart ausgewählter Mongrel-Prozesse dynamisch durchführen können.

Aus Gründen, auf die ich hier nicht näher eingehen möchte, kann es jedoch manchmal so sein sehr Es ist wichtig, dass wir einen Mongrel nicht unterbrechen, während er eine Anfrage bearbeitet. Daher gehe ich davon aus, dass ein einfacher Prozessabbruch nicht die Lösung ist.

Im Idealfall möchte ich dem Mischling ein Signal senden, das besagt: „Beenden Sie alles, was Sie gerade tun, und hören Sie dann auf, bevor Sie weitere Verbindungen annehmen.“

Gibt es hierfür eine Standardtechnik oder Best Practice?

War es hilfreich?

Lösung

Ich habe die Mongrel-Quelle ein wenig genauer untersucht und es stellte sich heraus, dass Mongrel einen Signalhandler installiert, um einen Standardprozessabbruch (TERM) abzufangen und ein ordnungsgemäßes Herunterfahren durchzuführen, sodass ich schließlich keine spezielle Prozedur benötige.

Sie können anhand der Protokollausgabe erkennen, dass dies funktioniert, wenn Sie einen Mischling töten, während dieser eine Anfrage verarbeitet.Zum Beispiel:

** TERM signal received.
Thu Aug 28 00:52:35 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown'
Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:41 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown'
Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:43 +0000 2008 (13051) Rendering layoutfalsecontent_typetext/htmlactionindex within layouts/application

Andere Tipps

Schauen Sie sich die Verwendung von Monit an.Sie können mongrel basierend auf der Speicher- oder CPU-Auslastung dynamisch neu starten.Hier ist eine Zeile aus einer Konfigurationsdatei, die ich für einen meiner Kunden geschrieben habe.

check process mongrel-8000 with pidfile /var/www/apps/fooapp/current/tmp/pids/mongrel.8000.pid
    start program = "/usr/local/bin/mongrel_rails cluster::start --only 8000"
    stop program = "/usr/local/bin/mongrel_rails cluster::stop --only 8000"

    if totalmem is greater than 150.0 MB for 5 cycles then restart       # eating up memory?
    if cpu is greater than 50% for 8 cycles then alert                  # send an email to admin
    if cpu is greater than 80% for 5 cycles then restart                # hung process?
    if loadavg(5min) greater than 10 for 3 cycles then restart          # bad, bad, bad
    if 3 restarts within 5 cycles then timeout                         # something is wrong, call the sys-admin

    if failed host 192.168.106.53 port 8000 protocol http request /monit_stub
        with timeout 10 seconds
        then restart
    group mongrel

Anschließend wiederholen Sie diese Konfiguration für alle Ihre Mongrel-Cluster-Instanzen.Die Zeile „monit_stub“ ist lediglich eine leere Datei, die monit herunterzuladen versucht.Wenn dies nicht möglich ist, wird auch versucht, die Instanz neu zu starten.

Notiz:Die Ressourcenüberwachung scheint unter OS X mit dem Darwin-Kernel nicht zu funktionieren.

Die bessere Frage ist, wie Sie verhindern können, dass Ihre App so viel Speicher verbraucht, dass Sie Mischlinge von Zeit zu Zeit neu starten müssen.

www.modrails.com hat unseren Speicherbedarf erheblich reduziert

Sumpfig:

Wenn ein Prozess ausgeführt wird, wird dieser ordnungsgemäß heruntergefahren (bearbeitet alle Anforderungen in seiner Warteschlange, die nur 1 sein sollte, wenn Sie den richtigen Lastausgleich verwenden).Das Problem besteht darin, dass Sie den neuen Server erst starten können, wenn der alte ausfällt, sodass Ihre Benutzer im Load Balancer in der Warteschlange stehen.Was ich als erfolgreich empfunden habe, ist eine „Kaskade“ oder ein fortlaufender Neustart der Mischlinge.Anstatt sie alle zu stoppen und alle zu starten (also Anfragen in die Warteschlange zu stellen, bis der eine Mischling fertig, gestoppt und neu gestartet ist und Verbindungen akzeptiert), können Sie jeden Mischling nacheinander stoppen und dann starten und so den Aufruf blockieren, den nächsten Mischling neu zu starten, bis der vorherige fertig ist Sichern (verwenden Sie eine echte HTTP-Überprüfung für einen /status-Controller).Während Ihre Mischlinge rollen, ist jeweils nur einer ausgefallen und Sie bedienen zwei Codebasen. Wenn Sie dies nicht können, sollten Sie für eine Minute eine Wartungsseite aufrufen.Sie sollten dies mit capistrano oder einem anderen Bereitstellungstool automatisieren können.

Ich habe also 3 Aufgaben:cap:deploy – führt die herkömmliche Methode „Alles gleichzeitig neu starten“ mit einem Hook aus, der eine Wartungsseite einrichtet und diese nach einer HTTP-Überprüfung wieder entfernt.cap:deploy:rolling – wodurch dies kaskadiert über die Maschine erfolgt (ich ziehe aus einem iClassify, um zu wissen, wie viele Mischlinge sich auf der gegebenen Maschine befinden), ohne eine Wartungsseite.cap Deploy:Migrations – führt Wartungsseiten und Migrationen durch, da es normalerweise keine gute Idee ist, Migrationen „live“ auszuführen.

Versuchen Sie es mit:

mongrel_cluster_ctl stop

Sie können auch Folgendes verwenden:

mongrel_cluster_ctl restart

Hast du eine Frage

Was passiert, wenn /usr/local/bin/mongrel_rails cluster::start --only 8000 ausgelöst wird?

Werden alle Anfragen von diesem bestimmten Prozess bis zu ihrem Ende bearbeitet?oder werden sie abgetrieben?

Ich bin gespannt, ob diese ganze Start-/Neustart-Sache ohne Auswirkungen auf die Endbenutzer durchgeführt werden kann ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top