¿Cómo selecciono qué MPM de Apache usar?

261

Esta es una pregunta canónica sobre la selección del Apache httpd MPM correcto.

Estoy un poco confundido entre los diferentes MPM ofrecidos por Apache: 'trabajador', 'evento', 'prefork', etc.

¿Cuáles son las principales diferencias entre ellos y cómo puedo decidir cuál será el mejor para una implementación determinada?

Tiffany Walker
fuente
44
Si está apoyando mod_php, entonces está haciendo prefork.
Zoredache
66
@Zoredache:? ella nunca mencionó PHP, e incluso si lo hubiera hecho, mod_php solo descartaría el evento. ¿O todavía te aferras a un comentario hecho por RL hace 8 años? El último error registrado en PHP relacionado con apache enhebrado fue en 2005.
symcbean
2
Lo sentimos, tengo que votar para cerrar esto, es una pregunta demasiado amplia para responder aquí.
symcbean
1
@symcbean Re: PHP y subprocesos: el núcleo de PHP es seguro para subprocesos en estos días, pero no hay muchas otras cosas en las que la gente compilará. Me ha picado en fecha tan reciente como el año pasado, así que es en gran medida una "prueba (ampliamente) antes de confiar en él en la producción de" situación todavía ...
voretaq7
Dependiendo del sistema operativo que esté utilizando, es posible que ni siquiera tenga todas esas opciones disponibles con una instalación estándar.
John Gardeniers

Respuestas:

415

Hay una serie de módulos MPM (Módulos Multi-Processing), pero con mucho, el más ampliamente usado (al menos en las plataformas * nix) son los tres principales: prefork, worker, y event. Esencialmente, representan la evolución del servidor web Apache y las diferentes formas en que el servidor se ha creado para manejar las solicitudes HTTP dentro de las limitaciones informáticas del tiempo a lo largo de su largo historial (en términos de software).


prefork

mpm_preforkes ... bueno ... es compatible con todo. Escinde una serie de procesos secundarios para atender solicitudes, y los procesos secundarios solo sirven una solicitud a la vez. Debido a que tiene el proceso del servidor sentado allí, listo para la acción, y no necesita lidiar con la organización de subprocesos, en realidad es más rápido que los MPMs de subprocesos más modernos cuando solo se trata de una sola solicitud a la vez, pero las solicitudes concurrentes sufren, ya que están hechos para esperar en línea hasta que el proceso de un servidor sea gratuito. Además, al intentar escalar en el recuento de procesos secundarios prefork, fácilmente absorberá un poco de RAM grave.

Probablemente no sea aconsejable usar prefork a menos que necesite un módulo que no sea seguro para subprocesos.

Use if: necesita módulos que se rompan cuando se usan hilos, como mod_php. Incluso entonces, considere usar FastCGI y php-fpm.

No use si: Sus módulos no se romperán en subprocesos.

worker

mpm_workerutiliza subprocesos, que es una gran ayuda para la concurrencia. El trabajador separa algunos procesos secundarios, que a su vez generan subprocesos secundarios; similar a prefork, algunos hilos de repuesto se mantienen listos si es posible, para dar servicio a las conexiones entrantes. Este enfoque es mucho más amable en RAM, ya que el recuento de subprocesos no tiene una relación directa con el uso de la memoria como lo hace el recuento de servidores en prefork. También maneja la concurrencia mucho más fácilmente, ya que las conexiones solo necesitan esperar un subproceso libre (que generalmente está disponible) en lugar de un servidor de repuesto en prefork.

Use si: está en Apache 2.2 o 2.4 y está ejecutando principalmente SSL.

No use if: Realmente no puede salir mal, a menos que necesite prefork para compatibilidad.

Sin embargo, tenga en cuenta que las bandas de rodadura están unidas a conexiones y no a solicitudes , lo que significa que una conexión de mantenimiento siempre mantiene un hilo hasta que se cierra (que puede ser mucho tiempo, dependiendo de su configuración). Por eso tenemos ...

event

mpm_eventes muy similar al trabajador, estructuralmente; acaba de pasar del estado 'experimental' al 'estable' en Apache 2.4. La gran diferencia es que utiliza un subproceso dedicado para tratar las conexiones mantenidas vivas, y entrega las solicitudes a subprocesos secundarios solo cuando se ha realizado una solicitud (permitiendo que esos subprocesos se liberen inmediatamente después de que se complete la solicitud). Esto es excelente para la concurrencia de clientes que no necesariamente están todos activos a la vez, pero que hacen solicitudes ocasionales y cuando los clientes pueden tener un tiempo de espera prolongado para mantenerse con vida.

La excepción aquí es con conexiones SSL; en ese caso, se comporta de manera idéntica al trabajador (pegando una conexión dada a un hilo dado hasta que se cierra la conexión).

Use if: está en Apache 2.4 y le gustan los hilos, pero no le gusta tener hilos esperando conexiones inactivas. ¡A todos les gustan los hilos!

No use si: No está en Apache 2.4, o necesita prefork para compatibilidad.


En el mundo actual de slowloris , AJAX y navegadores a los que les gusta multiplexar 6 conexiones TCP (con mantener vivo, por supuesto) a su servidor, la concurrencia es un factor importante para que su servidor escale y escale bien. La historia de Apache lo ha atado a este respecto, y aunque en realidad aún no está a la altura de los gustos de nginx o lighttpd en términos de uso de recursos o escala, está claro que el equipo de desarrollo está trabajando para construir un servidor web que todavía sea relevante en el mundo actual de alta concurrencia de solicitudes.

Shane Madden
fuente
3
-1: IME, el trabajador solo reduce el tamaño de la huella httpd en la región del 15% (IIRC Linux informa COW en RSS, lo que hace que pre-fork parezca que usa mucha más memoria de la que usa). Hay una diferencia insignificante entre la huella del núcleo para un proceso y un hilo NPTL. Está muy lejos de ser devastador. No entiendo por qué cree que esperar y asignar un hilo es más eficiente en términos de programación que esperar / programar un proceso (pre-bifurcado). Ni qué importancia cree que tiene SSL en general.
symcbean
99
@symcbean ¿Entonces estás diciendo que el 15% de uso de RAM no es significativo? Eso está bien, pero mi opinión sería otra. Los reclamos de desempeño de concurrencia no son míos. Ver aquí . Y la diferencia de SSL se explica claramente en la documentación para el evento 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
3
@ShaneMadden `y aunque realmente todavía no está a la altura de los gustos de nginx o lighttpd en términos de uso de recursos o escala` He tenido un piso apache en ambos sistemas.
Kelly Elton
@ShaneMadden con respecto al problema con SSL y el evento MPM: ¿Sabe si nginx maneja esto significativamente mejor que apache?
DASKAjA
Parece que si compila Apache 2.4 sin conocer los módulos mpm, viene con un módulo llamado módulo de evento mpm y funciona con mod_php7 (en este momento estoy investigando mpm porque apache2.4 está excediendo el límite de conexión mysql mientras que apache 2.2 con el mismo servidor mysql es no)
BioHazard
8

Aquí hay una buena explicación de cómo funciona con los gifs:

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

Brevemente: si tiene 2.4 y necesita httpd como proxy inverso (despachador), su elección es un MPM de evento

Yura
fuente
¿Incluso si usamos SSL? Uso apache como proxy y habilitador SSL en un sitio web que no es SSL.
bokan
@bokan parece que sí, este es el mejor, pero de todos modos el proxy es limitado para SSL
Yura
Wow ~ La publicación del blog es mucho mejor que la respuesta aceptada, ¡y los gifs son maravillosos! Gracias Salvaste mi día.
Rick
6

A partir de febrero de 2018, la documentación de Apache 2.4 para Event MPM establece que el uso de Apache como proxy evitará que el "manejo mejorado de la conexión" desde 2.4.24 funcione como fue diseñado. Vea la sección de Limitaciones .

El problema es que, como proxy, el trabajador no puede saber dónde está el final de la respuesta y se verá obligado a esperar hasta que se vea la respuesta completa antes de devolver el control al oyente.

Por esta razón, parece que usar el modelo Worker puede ser mejor para cuando apache se usa como proxy. Realmente no me queda claro si hay ventajas para el modelo de eventos en un entorno proxy, pero tal vez sí.

AndOr
fuente
5

Principalmente depende de qué módulos de Apache desea usar. Creo que trabajador es generalmente la opción predeterminada, pero algunos módulos (más antiguos) requieren bifurcación y dependen de prefork.

Si no tiene preferencias, le recomiendo que elija la dependencia preferida de su distribución del sistema operativo. Ubuntu, por ejemplo, instalará por defecto mpm-worker cuando instale Apache2.

Jeroen
fuente