Vraag Hoe selecteer ik welke Apache MPM moet worden gebruikt?


Dit is een Canonical Question over het selecteren van de juiste Apache httpd MPM.

Ik ben een beetje in de war tussen de verschillende MPM's aangeboden door Apache - 'worker', 'event', 'prefork', etc.

Wat zijn de belangrijkste verschillen tussen beide en hoe kan ik beslissen welke het beste is voor een bepaalde implementatie?


243
2018-04-26 18:40


oorsprong


Als je mod_php ondersteunt, dan doe je prefork. - Zoredache
@Zoredache:? ze noemde nooit PHP, en zelfs als dat wel zo was, zou mod_php alleen een evenement uitsluiten. Of houd je je nog steeds vast aan een opmerking van RL 8 jaar geleden? De laatste fout in PHP gerelateerd aan apache met threads was in 2005. - symcbean
Sorry - ik moet stemmen om dit te sluiten - is veel te breed om hier een vraag te beantwoorden. - symcbean
@symcbean Re: PHP en Threads - PHP's core is tegenwoordig thread-veilig, maar veel andere dingen waarvan je zult merken dat mensen het niet compileren. Ik ben net als vorig jaar gebeten, dus het is echt een "test (uitgebreid) voordat ik er in de productie op vertrouw" nog steeds ... - voretaq7
Afhankelijk van het besturingssysteem dat u gebruikt, beschikt u mogelijk niet eens over al die opties met een standaardinstallatie. - John Gardeniers


antwoorden:


Er zijn een aantal MPM-modules (Multi-Processing Modules), maar veruit de meest gebruikte (tenminste op * nix platforms) zijn de drie belangrijkste: prefork, worker, en event. In wezen vertegenwoordigen ze de evolutie van de Apache-webserver en de verschillende manieren waarop de server is gebouwd om HTTP-aanvragen af ​​te handelen binnen de berekeningsbeperkingen van de tijd gedurende de lange (in softwaretermen) geschiedenis.


prefork

mpm_prefork is .. nou ... het is compatibel met alles. Het draait een aantal onderliggende processen af ​​voor het weergeven van verzoeken, en de onderliggende processen dienen slechts één verzoek tegelijk. Omdat het serverproces daar zit, klaar is voor actie en geen thread marshaling hoeft af te handelen, is het eigenlijk sneller dan de meer moderne MPM's met schroefdraad wanneer u slechts één verzoek tegelijkertijd verwerkt - maar gelijktijdige aanvragen lijden, omdat ze in de rij moeten wachten tot een serverproces gratis is. Bovendien, pogingen om op te schalen in de telling van prefork kindprocessen, zul je gemakkelijk wat serieuze RAM opzuigen.

Het is waarschijnlijk niet raadzaam om prefork te gebruiken, tenzij u een module nodig hebt die niet geschikt is voor threads.

Gebruik als: U hebt modules nodig die breken wanneer u threads gebruikt, zoals mod_php. Zelfs dan, overweeg het gebruik van FastCGI en php-fpm.

Gebruik niet als: Uw modules zullen niet breken tijdens het draadsnijden.

worker

mpm_worker maakt gebruik van threading - wat een grote hulp is voor concurrency. De arbeider laat enkele kindprocessen draaien, die op hun beurt de discussies van het kind afrollen; net als bij prefork, worden enkele reserve-threads zo mogelijk bijgehouden om inkomende verbindingen te onderhouden. Deze aanpak is veel vriendelijker voor RAM, omdat het aantal threads geen directe invloed heeft op het gebruik van het geheugen, zoals het aantal servers in prefork. Het handelt ook gelijktijdigheid veel gemakkelijker af, omdat de verbindingen gewoon moeten wachten op een gratis thread (die meestal beschikbaar is) in plaats van een reserveserver in prefork.

Gebruik als: Je bent op Apache 2.2 of 2.4 en je gebruikt voornamelijk SSL.

Gebruik niet als: Je kunt echt niet fout gaan, tenzij je prefork nodig hebt voor compatibiliteit.

Merk echter op dat de loopvlakken zijn bevestigd verbindingen en niet verzoeken - wat betekent dat een keep-alive-verbinding altijd een thread vasthoudt totdat deze is gesloten (dit kan een lange tijd duren, afhankelijk van uw configuratie). Dat is waarom we hebben ..

event

mpm_event lijkt sterk op werknemer, structureel; het is net verplaatst van 'experimenteel' naar 'stabiel' in Apache 2.4. Het grote verschil is dat het een speciale thread gebruikt om de keep-alive-verbindingen af ​​te handelen, en verzoeken alleen doorgeeft aan child-threads wanneer er daadwerkelijk een verzoek is gedaan (waardoor die threads onmiddellijk kunnen worden vrijgegeven nadat het verzoek is voltooid). Dit is geweldig voor gelijktijdigheid van clients die niet noodzakelijk allemaal tegelijkertijd actief zijn, maar af en toe verzoeken doen en wanneer de clients mogelijk een lange time-out voor keep-alive hebben.

De uitzondering is hier met SSL-verbindingen; in dat geval gedraagt ​​het zich identiek aan de werknemer (het lijmen van een bepaalde verbinding aan een gegeven thread totdat de verbinding wordt verbroken).

Gebruik als: U bevindt zich op Apache 2.4 en like-threads, maar u vindt het niet prettig om threads te hebben die wachten op inactieve verbindingen. Iedereen houdt van discussies!

Gebruik niet als: Je bent niet op Apache 2.4 of je hebt prefork nodig voor compatibiliteit.


In de wereld van vandaag van Slowloris opgenomen, AJAX en browsers die graag 6 TCP-verbindingen multiplexen (uiteraard met behoud van het leven) naar uw server, concurrency is een belangrijke factor bij het goed maken van uw serverschaal en -schaal. De geschiedenis van Apache heeft dit in verband gebracht, en hoewel het nog steeds niet klopt met die van nginx of lighttpd in termen van resourcegebruik of schaal, is het duidelijk dat het ontwikkelteam werkt aan het bouwen van een nog steeds relevante webserver in de hedendaagse high-request-concurrency wereld.


396
2018-04-27 02:27



-1: IME, werknemer verlaagt alleen de omvang van de httpd-footprint met ongeveer 15% (IIRC Linux meldt COW in RSS waardoor pre-fork eruit ziet alsof het veel meer geheugen gebruikt dan het doet). Er is een verwaarloosbaar verschil tussen de kernel-voetafdruk voor een proces en een NPTL-thread. Het is ver van wereldschokkend. Ik begrijp niet waarom u denkt dat het wachten op en toewijzen van een thread efficiënter is in het plannen van termen dan het wachten op / plannen van een (pre-forked) proces. Noch wat voor redenering denkt u dat SSL heeft over de hele she-knal. - symcbean
@symcbean Dus je zegt dat 15% RAM-gebruik niet significant is? Dat is prima, maar mijn mening zou anders zijn. Concurrency-prestatieclaims zijn niet de mijne. Zien hier. En het SSL-verschil is duidelijk omschreven in de documentatie voor het evenement MPM: 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♦
@ShaneMadden `en hoewel het eigenlijk nog steeds niet klopt met die van nginx of lighttpd in termen van resourcegebruik of schaal. 'Ik had beide systemen in de apache-vloer. - Kelly Elton
@ShaneMadden met betrekking tot het probleem met SSL en de gebeurtenis MPM: weet u of nginx dit aanzienlijk beter afhandelt dan apache? - DASKAjA
Het lijkt erop dat als je apache 2.4 compileert zonder te weten over mpm-modules het wordt geleverd met module met de naam event mpm module en het werkt met mod_php7 (op dit moment onderzoek ik mpm omdat apache2.4 mysql-verbindingslimiet overschrijdt, terwijl apache 2.2 met dezelfde mysql-server is niet) - BioHazard


Het hangt grotendeels af van welke Apache-modules u wilt gebruiken. Ik denk dat de werknemer over het algemeen de standaardkeuze is, maar sommige (oudere) modules vereisen forking en zijn afhankelijk van prefork.

Als u geen voorkeuren heeft, raad ik u aan de voorkeursparty uit uw OS-distributie te halen. Ubuntu zal bijvoorbeeld standaard mpm-worker installeren wanneer je Apache2 installeert.


5
2018-04-26 19:32





Hier is een goede uitleg over hoe het werkt met gifs:

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

In het kort: als u op 2.4 en je moet httpd als een reverse proxy (dispatcher) dus uw keuze is een Gebeurtenis MPM


5
2018-06-21 13:10





Vanaf februari 2018 staat in de Apache 2.4-documentatie voor Event MPM dat het gebruik van Apache als een proxy de "verbeterde verwerking van de verbinding" sinds 2.4.24 van het werken zoals ontworpen houdt. Zie de beperkingen sectie.

Het probleem is dat de medewerker als proxy niet kan zeggen waar het einde van het antwoord is en zal moeten wachten totdat het volledige antwoord is gezien voordat hij de controle aan de luisteraar overdraagt.

Om deze reden lijkt het erop dat het gebruik van het Worker-model het beste is wanneer apache als proxy wordt gebruikt. Het is mij niet echt duidelijk of er voordelen zijn aan het gebeurtenismodel in een proxy-omgeving, maar misschien wel.


3
2018-02-14 15:01