Wie wähle ich das zu verwendende Apache MPM aus?


261

Dies ist eine kanonische Frage zur Auswahl des richtigen Apache httpd MPM.

Ich bin ein bisschen verwirrt zwischen den verschiedenen MPMs, die Apache anbietet - 'worker', 'event', 'prefork' usw.

Was sind die Hauptunterschiede zwischen ihnen und wie kann ich entscheiden, welches für eine bestimmte Bereitstellung am besten geeignet ist?


4
Wenn du mod_php unterstützt, machst du Prefork.
Zoredache

6
@Zoredache:? Sie hat PHP nie erwähnt und selbst wenn, würde mod_php das Ereignis nur ausschließen. Oder klammern Sie sich noch an eine Bemerkung von RL vor 8 Jahren? Letzter in PHP angemeldeter Fehler im Zusammenhang mit Threaded Apache war 2005.
symcbean

2
Entschuldigung - ich muss abstimmen, um das zu schließen - ist eine viel zu breite Frage, um sie hier zu beantworten.
Symcbean

1
@symcbean Re: PHP und Threads - Der Kern von PHP ist heutzutage threadsicher, aber viele andere Dinge, in denen Sie Kompilierer finden, sind es nicht. Ich wurde erst letztes Jahr gebissen, es ist also immer noch ein "Test (ausgiebig), bevor ich mich in der Produktion darauf verlasse"
voretaq7

Je nach verwendetem Betriebssystem sind möglicherweise nicht alle Optionen bei einer Standardinstallation verfügbar.
John Gardeniers

Antworten:


415

Es gibt eine Reihe von MPM - Module (Multi-Processing - Module), aber mit Abstand die am weitesten verbreitete (zumindest auf * nix - Plattformen) sind die drei wichtigsten sind: prefork, workerund event. Im Wesentlichen repräsentieren sie die Entwicklung des Apache-Webservers und die verschiedenen Arten, wie der Server aufgebaut wurde, um HTTP-Anforderungen innerhalb der zeitlichen Recheneinschränkungen über die lange (softwaremäßig) Historie hinweg zu verarbeiten.


prefork

mpm_preforkist .. na ja .. es ist mit allem kompatibel. Es werden mehrere untergeordnete Prozesse für die Bearbeitung von Anforderungen ausgelagert, und die untergeordneten Prozesse bearbeiten jeweils nur eine Anforderung. Da der Serverprozess dort sitzt, einsatzbereit ist und sich nicht mit Thread-Marshalling befassen muss, ist er tatsächlich schneller als die moderneren Thread-MPMs, wenn Sie nur eine einzelne Anforderung gleichzeitig bearbeiten. da sie in der Schlange warten müssen, bis ein Serverprozess frei ist. Wenn Sie versuchen, die Anzahl der untergeordneten Prefork-Prozesse zu erhöhen, können Sie außerdem problemlos ernsthaften RAM-Speicher auslaugen.

Es ist wahrscheinlich nicht ratsam, Prefork zu verwenden, es sei denn, Sie benötigen ein Modul, das nicht threadsicher ist.

Verwenden Sie, wenn: Sie Module benötigen, die brechen, wenn Threads verwendet werden, z mod_php. Ziehen Sie auch dann die Verwendung von FastCGI und in Betracht php-fpm.

Nicht verwenden, wenn: Ihre Module beim Einfädeln nicht abbrechen.

worker

mpm_workerverwendet Threading - das ist eine große Hilfe für die Parallelität. Worker spinnt einige untergeordnete Prozesse ab, die wiederum untergeordnete Threads abspalten. Ähnlich wie bei Prefork werden einige Ersatz-Threads bereitgehalten, um eingehende Verbindungen zu bedienen. Dieser Ansatz schont den Arbeitsspeicher erheblich, da die Thread-Anzahl keinen direkten Einfluss auf die Speichernutzung hat, wie dies bei der Server-Anzahl in Prefork der Fall ist. Parallelität wird auch viel einfacher verarbeitet, da die Verbindungen nur auf einen freien Thread (der normalerweise verfügbar ist) warten müssen, anstatt auf einen Ersatzserver in Prefork.

Verwenden Sie diese Option, wenn Sie mit Apache 2.2 oder 2.4 arbeiten und hauptsächlich SSL verwenden.

Verwenden Sie nicht, wenn: Sie wirklich nichts falsch machen können, es sei denn, Sie benötigen Prefork für die Kompatibilität.

Beachten Sie jedoch, dass die Treads an Verbindungen und nicht an Anforderungen angehängt sind. Dies bedeutet, dass bei einer Keep-Alive-Verbindung ein Thread immer gehalten wird, bis er geschlossen wird (dies kann je nach Konfiguration lange dauern). Welches ist, warum wir haben ..

event

mpm_eventist Arbeiter strukturell sehr ähnlich; In Apache 2.4 wurde der Status von "experimentell" auf "stabil" geändert. Der große Unterschied besteht darin, dass ein dedizierter Thread für die Verwaltung der Verbindungen verwendet wird und Anforderungen nur dann an untergeordnete Threads weitergegeben werden, wenn tatsächlich eine Anforderung gestellt wurde (sodass diese Threads sofort nach Abschluss der Anforderung wieder freigegeben werden können). Dies ist ideal für die gleichzeitige Verwendung von Clients, die nicht unbedingt alle gleichzeitig aktiv sind, sondern gelegentlich Anforderungen stellen und bei denen die Clients möglicherweise ein langes Keep-Alive-Timeout haben.

Die Ausnahme hiervon sind SSL-Verbindungen. In diesem Fall verhält es sich wie ein Worker (eine bestimmte Verbindung mit einem bestimmten Thread verbinden, bis die Verbindung geschlossen wird).

Verwenden Sie diese Option, wenn: Sie mit Apache 2.4 arbeiten und Threads mögen, aber keine Threads auf inaktive Verbindungen warten möchten. Jeder mag Themen!

Verwenden Sie diese Option nicht, wenn: Sie nicht mit Apache 2.4 arbeiten oder aus Kompatibilitätsgründen Prefork benötigen.


In der heutigen Welt von Slowloris , AJAX und Browsern, die 6 TCP-Verbindungen (natürlich mit Keep-Alive) zu Ihrem Server multiplexen möchten , ist die Parallelität ein wichtiger Faktor für die Skalierung und Skalierung Ihres Servers. Die Geschichte von Apache hat diesbezüglich Abhilfe geschaffen, und obwohl es in Bezug auf die Ressourcennutzung oder -skalierung immer noch nicht mit Nginx oder Lighttpd vergleichbar ist, ist es klar, dass das Entwicklerteam daran arbeitet, einen Webserver aufzubauen, der immer noch relevant ist in der heutigen Welt mit hohen Anforderungen und Parallelität.


3
-1: IME, Worker reduziert die Größe des httpd-Footprints nur um ca. 15% (IIRC Linux meldet COW in RSS, wodurch Pre-Fork so aussieht, als würde es viel mehr Speicher belegen als es tut). Der Unterschied zwischen dem Kernel-Footprint für einen Prozess und einem NPTL-Thread ist vernachlässigbar. Es ist ein langer Weg von der Erschütterung der Erde entfernt. Ich verstehe nicht, warum Sie denken, dass das Warten auf und Zuweisen eines Threads in Bezug auf die Planung effizienter ist als das Warten / Planen eines (vorab gegabelten) Prozesses. Auch nicht, was Sie denken, was SSL im Großen und Ganzen zu bedeuten hat.
Symcbean

9
@symcbean Sie sagen also, dass 15% RAM-Auslastung nicht signifikant sind? Das ist in Ordnung, aber meine Meinung wäre anders. Leistungsansprüche wegen Nebenläufigkeit sind nicht meine eigenen. Sehen Sie hier . Und der SSL-Unterschied ist in der Dokumentation für die Veranstaltung MPM klar formuliert:The improved connection handling does not yet work for certain connection filters, in particular SSL. For SSL connections, this MPM will fall back to the behaviour of the worker MPM and reserve one worker thread per connection.
Shane Madden

3
@ShaneMadden `und obwohl es wirklich immer noch nicht mit Nginx oder Lighttpd in Bezug auf Ressourcenverbrauch oder Skalierung mithalten kann`, hatte ich bei beiden Systemen Apache.
Kelly Elton

@ShaneMadden in Bezug auf das Problem mit SSL und dem Ereignis MPM: Weißt du, ob Nginx dies deutlich besser handhabt als Apache?
DASKAjA

Es scheint, dass, wenn Sie Apache 2.4 kompilieren, ohne über MPM-Module Bescheid zu wissen, es mit dem Modul namens Event MPM-Modul geliefert wird und es mit mod_php7 funktioniert nicht)
BioHazard

8

Hier ist eine gute Erklärung, wie es mit Gifs funktioniert:

https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/

Kurz: Wenn Sie auf 2.4 und Sie brauchen httpd als Reverse Proxy (Dispatcher), so ist Ihre Wahl ein Event MPM


Auch wenn wir SSL benutzen? Ich verwende Apache als Proxy und SSL-Enabler auf einer Nicht-SSL-Website.
Bokan

@bokan sieht aus wie ja, das ist das Beste, aber trotzdem ist das Proxying für SSL begrenzt
Yura

Wow ~ Der Blog-Beitrag ist viel besser als die akzeptierte Antwort, und die GIFs sind wunderbar! Dankeschön. Du hast meinen Tag gerettet.
Rick

6

Ab Februar 2018 heißt es in der Apache 2.4-Dokumentation für Event MPM, dass die Verwendung von Apache als Proxy die "verbesserte Verbindungsbehandlung" seit 2.4.24 daran hindert, wie vorgesehen zu funktionieren. Siehe den Abschnitt Einschränkungen .

Das Problem ist, dass der Worker als Proxy nicht erkennen kann, wo das Ende der Antwort liegt, und dass er warten muss, bis die gesamte Antwort angezeigt wird, bevor er die Kontrolle an den Listener zurückgibt.

Aus diesem Grund scheint es am besten zu sein, das Worker-Modell zu verwenden, wenn Apache als Proxy verwendet wird. Mir ist nicht wirklich klar, ob das Ereignismodell in einer Proxy-Umgebung Vorteile hat, aber vielleicht gibt es diese.


5

Hängt hauptsächlich davon ab, welche Apache-Module Sie verwenden möchten. Ich denke, Worker ist im Allgemeinen die Standardauswahl, aber einige (ältere) Module erfordern das Gabeln und sind von Prefork abhängig.

Wenn Sie keine Präferenzen haben, empfehle ich Ihnen, die bevorzugte Abhängigkeit von Ihrer Betriebssystemverteilung zu wählen. Ubuntu zum Beispiel installiert standardmäßig mpm-worker, wenn Sie Apache2 installieren.

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.