2015-01-09 18 views
14

Das Ereignis MPM ist nicht genau das gleiche Design wie Nginx, aber es wurde eindeutig entworfen, um Keepalives haltbarer zu machen und statische Dateien schneller zu senden. Mein Verständnis ist, dass das Ereignis MPM ist ein wenig irreführend, weil:Warum funktioniert das Apache Event MPM schlecht?

  1. Obwohl die Verbindung kqueue geführt wird/epoll,
  2. einige sehr wichtige Module wie mod_gzip und mod_ssl blockieren/verbrauchen einen Thread, bis die Antwort ist, getan
  3. und das ist ein Problem für große Dateien, aber wahrscheinlich nicht für PHP-generierten HTML-Dokumente, etc.

Leider hält Apache Marktanteil zu verlieren, und die meisten Benchmarks für die Veranstaltung sind vernichtend MPM. Sind die Benchmarks fehlerhaft, oder schneidet das Event MPM gegen Nginx wirklich schlecht ab? Selbst unter diesen Einschränkungen sollte es im normalen Datenverkehr (nicht bösartig) und in kleineren Dateien mit Nginx konkurrieren. Zum Beispiel sollte es wettbewerbsfähig sein, PHP-generierte Dokumente über php-fpm auf langsamen Verbindungen zu bedienen, weil das Dokument gepuffert (auch wenn es ssl'd und gzip ist) und asynchron gesendet wird. Sowohl SSL- als auch Nicht-SSL-Verbindungen, die mit Komprimierung arbeiten oder nicht, sollten nicht wesentlich anders funktionieren als in Nginx bei einer solchen Arbeitslast.

Warum glänzt es nicht in verschiedenen Benchmarks? Was stimmt damit nicht? Oder was stimmt nicht mit den Benchmarks? Ist eine große Website es als Appell an die Autorität, die es ausführen kann?

+2

Das wäre eine viel bessere Frage, wenn Sie die Benchmarks zitiert hätten, auf die Sie sich beziehen. Wenn Sie einfach eine schnelle Installation wünschen, wird Ap force + mod_php bei niedrigen bis mittleren Lasten konsistent Nginx übertreffen - bei starker Auslastung gibt es einen großen Unterschied. Aber wenn Sie sowohl Kapazität als auch Leistung wünschen, sollten Sie sich eine andere Architektur anschauen - ATS/nginx/lack vor Ihren Webservern. – symcbean

+0

@symcbean Wahrscheinlich wahr. Ich muss nur noch einen finden (außer dem, der von Apache veröffentlicht wurde), der gut aussieht. Ich denke auch, dass du übergeneralisierst. ATS oder Varnish werden sehr wenig (oder schädlich) für dynamischen Inhalt sein, der nicht zwischengespeichert werden kann. –

+0

Au contraire. Das Ausführen eines ereignisbasierten Servers vor einem Pre-Fork-Webserver bietet Schutz vor slororis-Angriffen und entlastet die Bereitstellung statischer Inhalte, wodurch Speicher gespart und die Kapazität erhöht wird. Die zusätzliche Latenz bei dynamischem Inhalt sollte in der Größenordnung von einigen Millisekunden liegen - kaum erderschütternd. In der Tat, wenn Sie den Reverse-Proxy näher an die Clients verschieben können, sollten Sie eine deutliche Verbesserung der Leistung sehen. – symcbean

Antwort

3

Für mich sind die dominierenden operativen Unterschiede sind, dass in Fall:

  • Handler (Plug-ins für die Erzeugung der Antwort) sind synchron - wenn sie entweder Berechnung durchführen oder I/O werden sie binden ein Gewinde
  • der Kern muss verkanten Schlösser verwenden Schlüsseldatenstrukturen zu schützen, weil es so viele dieser synchronen Anforderungen multi-threaded ist

aus diesem Grunde bei sehr hohen Volumen-Servern wie nginx (oder Apache Traffic zu unterstützen Serv oder irgendein moderner kommerzieller/Hochleistungs-Proxy) kommt in der Regel voraus.

IMO Die Kugeln in Ihrer Frage sind ein wenig daneben, SSL und deflate tragen nicht wirklich viel zu den Unterschieden hier bei, da sie beide Filter nicht wirklich zu Skalierbarkeitsproblemen beitragen oder sogar httpd zu seinem traditionellen binden API garantiert den Lebenszyklus einer Anfrage oder Verbindung. Filter wie diese (vs. Handler oder der Kernfilter, der für die Low-Level-I/O verantwortlich ist) sind wahrscheinlich die wenigsten Dinge, die an das Verarbeitungsmodell gebunden sind.

Aber ich denke auch nicht, dass es im Vergleich für alle bis auf die extremsten Arbeitslasten oder extrem eingeschränkte Systeme so schlecht ist. Die meisten Benchmarks, die ich gesehen habe, sind aus dem einen oder anderen Grund von extrem schlechter Qualität.

Ich glaube, dass die meisten Leute wollen, was sie einen Webserver heute als Proxy für einen anspruchsvolleren Anwendungsserver (Java EE, PHP, etc) und einen Server bezeichnen, der E/A effizient umwandelt, ohne API-Gepäck zu haben die Kante haben.

+0

Ich sollte hinzufügen, dass ich so voreingenommen bin, wie sie als Apache httpd Contributor kommen können. – covener

+1

Danke! Ich gebe zu, von einem schnellen Audit des Codes und der Dokumentation zu raten. Ich hatte Recht mit den Handlern, aber ich hatte Unrecht, und ich vermisste die Verriegelung. Der Grund, warum ich diese Module erwähnt habe, ist, dass ich es als großes Problem bei großen statischen Dateien sehen kann. Google möchte, dass wir 2015 zu Everything-SSL wechseln. Ich kann sogar sehen, dass SSL zum Kernel wechselt, weil wir die Datei nicht mehr einfach zuordnen und senden können. Aber zumindest in Nginx wird es uns nicht von Threads in Vollzeit berauben. Es kann ssh/gzip + epoll für einige Threads Block für Block verwenden, vielleicht mit einer gewissen Affinität. Liege ich falsch? Gzip wirft ähnliche Probleme auf. –

10

Es ist langsamer als nginx, weil Apache mit dem Ereignis MPM (sehr) ungefähr einem ereignisgesteuerten HTTP-Proxy (nginx, lack, haproxy) vor Apache mit dem Worker-MPM entspricht.Ereignis ist Worker, aber anstatt jede neue Verbindung zu einem Thread für seine Lebensdauer zu übergeben, übergeben das Ereignis MPM-Threads die Verbindung zu einem sekundären Thread, die es in eine Warteschlange schiebt oder schließt, wenn Keep-Alive deaktiviert ist oder abgelaufen ist.

Der wirkliche Vorteil von Ereignis über Arbeiter ist die Ressourcennutzung. Wenn 1.000 gleichzeitige Verbindungen aufrechterhalten werden müssen, benötigt das Worker-MPM 1.000 Threads, während das Ereignis MPM mit 100 aktiven Threads und 900 inaktiven Verbindungen, die in der Ereigniswarteschlange verwaltet werden, auskommen kann. Das Ereignis MPM wird einen Bruchteil der Ressourcen des Worker MPM in diesem hypothetischen verwenden, aber der Nachteil ist immer noch da: jede dieser Anfragen wird von einem separaten Thread behandelt, der vom Kernel geplant werden muss und als solcher die Kosten von Kontext wechseln.

Auf der anderen Seite haben wir Nginx, die das Ereignismodell selbst als Scheduler verwendet. Nginx verarbeitet einfach so viel Arbeit an jeder Verbindung wie möglich, bevor es zur nächsten übergeht. Es ist kein zusätzlicher Kontextwechsel erforderlich. Der einzige Anwendungsfall, in dem das Event-MPM wirklich glänzt, ist die Handhabung eines Setups, bei dem eine umfangreiche Anwendung in Apache ausgeführt wird. Um die Ressourcen von Threads zu erhalten, die während Keep-Alive inaktiv sind, würden Sie einen Proxy bereitstellen (http://go.microsoft.com/fwlink/?LinkId=8907). wie nginx) vor Apache. Wenn Ihr Frontend keinem anderen Zweck diente (z. B. statischer Inhalt, Proxyserver für andere Server usw.), verarbeitet das Ereignis MPM diesen Anwendungsfall wunderschön und beseitigt die Notwendigkeit für einen Proxy.

+0

Genau deshalb würde ich erwarten, dass es gut läuft, wenn Sie das Apache-Event MPM + PHP-fpm verwenden. Es sollte nicht viel oder etwas schlechter als Nginx + PHP-fpm tun. Aber jede Benchmark sagt, es nicht. Zeit, meine eigene Benchmark zu machen. Sie hätten diese "Keep-Alive-Optimierung" übrigens auch auf jedes MPM anwenden können - inklusive Prefork.Nichts würde sie daran hindern, einen Master-Prozess zu verwenden, um im Leerlauf gehaltene Verbindungen zu verfolgen und sie nur an einen Prozess im Pool weiterzugeben, wenn dieser aktiv ist. Sie haben es nur den Arbeitern angetan. –

+1

Der Vergleich, den ich machte, war Nginx + Apache-Arbeiter + PHP-fpm ~~ Apache-Ereignis + PHP-fpm. Nginx + PHP-fpm wird _always_ deutlich besser abschneiden als Apache-event + PHP-fpm, da jede FastCGI-Verbindung unter Apache von einem separaten Thread behandelt werden muss. Wenn php threadsicher wäre, könntest du durch Apache-event + mod_php der Leistung von Nginx viel näher kommen, aber leider ist es nicht ... –

+0

Vielleicht missverstehe ich, aber die Lebensdauer des Threads wird sehr kurz sein, weil die meisten Verbindungen zu php-fpm wird kurz sein. Die Antwort ist klein (ein HTML-Dokument ist typischerweise 10-100k), wird gepuffert und in einer ereignisbasierten Weise gesendet. Ich denke, Nginx kann das ohne einen Thread pro Verbindung mit einem Zustandsautomaten, der mit php-fpm redet, tun. Es würde es wahrscheinlich auch puffern, denn sonst würde es das Problem, das prefork mit langsamen Verbindungen hat, neu erstellen und es einfach an einen php-fpm-Prozess statt an einen httpd-Prozess zurückschicken. Ich würde nicht denken, dass der Unterschied so groß wäre. –

Verwandte Themen