Was muss installiert werden: Apache Worker oder Prefork? Was sind die (Un-) Vorteile von jedem?

55

Basierend auf den Beschreibungen für Prefork und Worker MPM scheint der Prefork-Typ etwas veraltet zu sein, aber ich kann keinen richtigen Vergleich zwischen den beiden Typen finden.

Was ich gerne wissen würde:

  • Was sind die Unterschiede zwischen den beiden Versionen?
  • Was sind die (Un-) Vorteile jedes Servertyps?
  • Gibt es grundlegende Richtlinien für die Auswahl des Typs anhand der Bedingungen?
  • Gibt es große Leistungsunterschiede zwischen den beiden?
Aron Rotteveel
quelle

Antworten:

40

Wie in den Dokumenten angegeben, sollten Sie das Prefork-MPM verwenden, wenn Sie aus Gründen der Kompatibilität mit nicht thread-sicheren Bibliotheken das Threading vermeiden möchten. In der Regel hat jedes nicht triviale Apache-Modul ( mod_phpoder genauer gesagt die Vielzahl der Erweiterungen und Bibliotheken, mit denen es verknüpft ist - das kanonische Beispiel) eine Art nicht thread-sichere Bibliothek (oder eine nicht thread-sichere Bibliothek). sicherer Code drin). Wenn Sie also keine Apache-Installation auf ziemlich hohem Standard verwenden, würde ich mich für den Prefork-MPM entscheiden.

womble
quelle
3
Ich hätte das Worker-MPM empfohlen, es sei denn, Sie verwenden PHP. Worker ist das empfohlene MPM von Apache und bietet eine bessere Leistung und geringeren Overhead. Es ist nur so, dass PHP-Entwickler noch nie von Thread-Sicherheit gehört haben, die Sie für die Verwendung von Prefork benötigen.
David Pashley
16
PHP ist seit langer Zeit threadsicher. Sie schlagen nur die Verwendung von Pre-Forkern vor, da sie nicht kontrollieren können, was andere Bibliotheken tun. Hören Sie auf, PHP für Inaktionen anderer Entwickler verantwortlich zu machen.
Alister Bulman
3
PHP mag threadsicher sein (obwohl ich es bezweifle), aber alle Bibliotheken, auf die es verlinkt, sind definitiv nicht. Hier führen wir einige ziemlich große PHP-Anwendungen aus und versuchen alle paar Monate, von Prefork zu Worker zu wechseln, aber wir bekommen sofort beschädigte Daten.
Aleksandar Ivanisevic
5
Zumindest die Änderung der ENV-Variablen ist nicht threadsicher, setlocal php.net/manual/en/function.setlocale.php ist ein häufiges Beispiel dafür.
Radius
4
Ein Hinweis: Diese Probleme treten nicht auf, wenn PHP zB mit php-fpmvia FastCGI verbunden ist. Dann ist das Worker-MPM in Ordnung - dann führt die fpm jede PHP-Anfrage in einem eigenen Prozess aus, während der Apache Threaded ausführen kann. Das PHP-Thread-Sicherheitsproblem verhindert nur die Verwendung von mod_phpPHP innerhalb des Apache-Prozesses.
Mschuett
13

Die klassische Lösung zur Ausführung unsicherer Erweiterungen bei gleichzeitiger Verwendung einer großen Anzahl (> 100) von Verbindungen besteht darin, PHP auf fastCGI (mod_fcgid, ein natives Apache-Modul) und dynamische Proxy-Anforderungen von einer Apache-Instanz auszuführen, auf der Worker MPM ausgeführt wird.

Auf diese Weise können Sie bei einer Mischung aus statischen und dynamischen Inhalten von einigen hundert bis zu 1000 gleichzeitigen Verbindungen mit einer bescheidenen Speicherkapazität (4 bis 8 GB) skalieren.

Natürlich sollten Sie auch Front-End-Caching-Lösungen als Teil Ihrer Gesamtbereitstellung (memcached, lackiert) untersuchen.

Alternativ können Sie ein Upgrade auf Apache 2.4 und dessen systemeigenes Ereignis- MPM durchführen, das die Parallelität erheblich verbessert (Threads werden beim Herstellen der Verbindung ausgelöst und warten nicht auf eine Abfrage).

adaptr
quelle
Könntest du den Event-Kommentar erweitern? Wie steht es mit mpm-worker?
Sirex
Während das Worker-MPM bereits Thread-basiert war und daher viel schneller gestartet und leichter ausgeführt werden konnte, fragt das Ereignis-MPM den Socket nicht mehr ab - es wird bei Aktivitäten benachrichtigt. daher "Ereignis".
11.
sollte es also auf Websites mit hohem Datenverkehr (13k / sec) besser funktionieren?
Sirex
6

Es ist ungefähr 3 Jahre her, seit die Frage veröffentlicht wurde, aber ich würde empfehlen, dass Sie Worker MPM anstelle von Pre-Fork verwenden, auch wenn Sie PHP verwenden, um eine bessere Leistung zu erzielen.

In Bezug auf die Unterschiede ist Pre-Fork ohne Threading, daher gibt der Server einen Prozess für jede Client-Anfrage vor (er gibt eine Vorab-Abfrage in Erwartung neuer Anfragen vor, damit das Forken nicht die Antwortzeit einschränkt). Da Anfragen in einem separaten Prozess verarbeitet werden, belastet dies in der Regel Ihren Arbeitsspeicher und Ihre CPU erheblich mehr als. Der Arbeiter bringt Multi-Threading mit, das leichter ist und eine bessere Speichernutzung hat.

Aleemb
quelle
2

Dies ist etwas ganz Besonderes für das, wofür Sie dienen. Wenn Sie viele kleine statische Verbindungen herstellen, sind die Threads leichter und schneller. Wenn Sie nur wenige große Apps haben, die ständig auftauchen, kann Prefork aufgrund seiner Reife und Stabilität einen Vorteil haben. Warum nicht einfach das einrichten, was Sie brauchen, eines testen, das MPM-Modul austauschen, es erneut versuchen und sehen, welches am besten zu Ihnen passt?

Marcin
quelle
Sie können das MPM in Apache 2.2 nicht beliebig "austauschen". Es wird zur Kompilierungszeit festgelegt.
2.
Sie können mit apt oder RPMs. Debian hat verschiedene Apache 2-Pakete, je nachdem, welchen Stil Sie bevorzugen.
Brendan Byrd
1

Das hängt von der Art und Art des Verkehrs ab, den Sie haben werden. Und auch zuerst müssen Sie den Hauptunterschied zwischen der Vorgabel und dem Arbeiter verstehen. Hoffe, der folgende Artikel wird Ihnen helfen, herauszufinden! http://slashroot.in/how-is-nginx-different-from-apache

sarath
quelle
2
Wir bevorzugen Antworten, die Inhalte enthalten, und keine Links zu Inhalten. Wenn Sie eine Zusammenfassung der Inhalte des Link-Ziels bereitstellen könnten, ist dies eine bewährte Methode. Link-rot passiert.
sysadmin1138
1
Frage war über Apache (Nginx ist nicht Apache) und die relativen Vorzüge von Prefork oder Threads (Nginx verwendet keine)
symcbean