Was genau ist ein Pre-Fork-Webservermodell?

94

Ich möchte wissen, was es genau bedeutet, wenn sich ein Webserver als Pre-Fork-Webserver bezeichnet. Ich habe einige Beispiele wie Einhorn für Rubin und Gunicorn für Python.

Genauer gesagt sind dies die Fragen:

  • Welches Problem löst dieses Modell?
  • Was passiert, wenn ein Pre-Fork-Webserver zum ersten Mal gestartet wird?
  • Wie geht es mit Anfragen um?

Auch eine spezifischere Frage für Einhorn / Gunicorn:

Angenommen, ich habe eine Webanwendung, die ich mit (g) Einhorn ausführen möchte. Bei der Initialisierung führt die Webanwendung einige Initialisierungsaufgaben durch (z. B. zusätzliche Datenbankeinträge ausfüllen). Wenn ich (g) Einhorn mit mehreren Workern konfiguriere, wird das Initialisierungsmaterial dann mehrmals ausgeführt?

Hery
quelle

Antworten:

102

Pre-Forking bedeutet im Grunde, dass ein Master Gabeln erstellt, die jede Anforderung bearbeiten. Eine Gabel ist ein völlig separater * nix-Prozess.

Update gemäß den Kommentaren unten. Das preIn pre-forkbedeutet, dass diese Prozesse vor dem Eingang einer Anforderung gegabelt werden. Sie können jedoch normalerweise erhöht oder verringert werden, wenn die Last auf und ab geht.

Pre-Forking kann verwendet werden, wenn Sie Bibliotheken haben, die NICHT threadsicher sind. Dies bedeutet auch, dass Probleme innerhalb einer Anforderung, die Probleme verursachen, nur den Prozess betreffen, von dem sie verarbeitet werden, und nicht den gesamten Server.

Die mehrfach ausgeführte Initialisierung hängt davon ab, was Sie bereitstellen. Normalerweise existieren jedoch für jeden Prozess Verbindungspools und ähnliches.

In einem Threading-Modell würde der Master leichtere Threads erstellen, um auch Anforderungen zu versenden. Wenn ein Thread jedoch massive Probleme verursacht, kann dies Auswirkungen auf den Master-Prozess haben.

Mit Tools wie Nginx, Event MPM von Apache 2.4 oder gevent (das mit Gunicorn verwendet werden kann) sind diese asynchron, was bedeutet, dass ein Prozess Hunderte von Anforderungen verarbeiten kann, ohne zu blockieren.

Joe Doherty
quelle
28
Ich hatte den gleichen Zweifel an der Bedeutung von "Prefork". Ich nahm an, dass es natürlich eine Art Gabeln bedeutete, aber der "Pre" -Teil verwirrte mich. Ich fand hier abbreviations.com/prefork, dass der "Pre" -Teil tatsächlich bedeutet, dass Worker-Prozesse im Voraus erstellt werden, so dass keine Zeitverschwendung nur dann verschwendet wird, wenn ein Worker benötigt wird. Macht für mich sehr viel Sinn :)
El Ninja Trepador
1
//, @ElNinjaTrepador, warum nicht eine separate Antwort hinzufügen? Das war zumindest für mich viel verständlicher, und es kann anderen mehr helfen, wenn dieser Kommentar einen prominenteren Platz einnimmt.
Nathan Basanese
2
Ich habe die Antwort aktualisiert, um ein bisschen mehr Informationen zum Pre in Pre-Fork hinzuzufügen. @ ElNinjaTrepador, danke, dass du darauf hingewiesen hast. Ich wusste nicht, dass das nicht bekannt ist.
Joe Doherty
1
@ NathanBasanese wird Sir tun;)
El Ninja Trepador
4
@JoeDoherty Vielleicht ist es bekannt, es war mir bis dahin einfach nicht bekannt: DI wollte eine weitere Antwort hinzufügen (gemäß Nathans Anfrage), aber da Sie hinzugefügt haben, was ich zu Ihrer gesagt habe, ist es nicht mehr notwendig: )
El Ninja Trepador