¿Cuál instalar: Apache Worker o Prefork? ¿Cuáles son las (des) ventajas de cada uno?

55

Según las descripciones de Prefork y Worker MPM, parece que el tipo de prefork está algo desactualizado, pero realmente no puedo encontrar una comparación adecuada de los dos tipos.

Lo que me gustaría saber:

  • ¿Cuáles son las diferencias entre las dos versiones?
  • ¿Cuáles son las (des) ventajas de cada tipo de servidor?
  • ¿Existen pautas básicas sobre qué tipo elegir según las condiciones?
  • ¿Hay alguna gran diferencia de rendimiento entre los dos?
Aron Rotteveel
fuente

Respuestas:

40

Como dicen los documentos, debe usar el MPM prefork si necesita evitar subprocesos para compatibilidad con bibliotecas no seguras para subprocesos. Por lo general, cualquier módulo Apache no trivial ( mod_phpo, más precisamente, la gran cantidad de extensiones y bibliotecas a las que se vincula, siendo el ejemplo canónico) tiene algún tipo de biblioteca no segura para subprocesos (o no tiene subprocesos) código seguro), así que a menos que esté utilizando una instalación de Apache bastante común, iría por el MPM prefork.

womble
fuente
3
Hubiera recomendado el trabajador MPM, a menos que estés ejecutando PHP. Worker es el MPM recomendado de apache y ofrece un mejor rendimiento y una sobrecarga menor. Es solo que el desarrollador de PHP nunca ha oído hablar de seguridad de subprocesos que necesita usar prefork.
David Pashley el
16
PHP ha sido seguro para subprocesos durante mucho tiempo. Solo sugieren el uso de pre-falsificadores ya que no pueden controlar lo que hacen otras bibliotecas. Deja de culpar a PHP por las inacciones de otros desarrolladores.
Alister Bulman el
3
PHP puede ser seguro para subprocesos (aunque lo dudo) pero todas las bibliotecas a las que enlaza definitivamente no lo son. Aquí ejecutamos algunas aplicaciones PHP bastante grandes y cada dos meses tratamos de cambiar de prefork a trabajador, pero obtenemos datos corruptos de inmediato.
Aleksandar Ivanisevic
55
Al menos la variable ENV que cambia la función no será segura para subprocesos, setlocal php.net/manual/en/function.setlocale.php es un ejemplo común de eso.
radio
44
Una nota: estos problemas no se aplican si PHP está conectado, por ejemplo, con php-fpmFastCGI Luego, el MPM de trabajo está bien, entonces el fpm ejecutará cada solicitud de PHP en un proceso propio, mientras que el Apache puede ejecutar subprocesos. El problema de seguridad de subprocesos de PHP solo evita que lo use mod_php, que ejecuta PHP dentro del proceso de Apache.
mschuett
13

La solución clásica para ejecutar extensiones inseguras mientras se sirven grandes cantidades (> 100) de conexiones concurrentes es ejecutar PHP en fastCGI (mod_fcgid, un módulo nativo de apache) y solicitudes dinámicas proxy desde una instancia de apache que ejecuta el Worker MPM.

Esto le permitiría escalar desde unos pocos cientos hasta> 1000 conexiones simultáneas con una cantidad modesta de memoria (4 ~ 8GB) cuando sirve una mezcla de contenido estático y dinámico.

Por supuesto, también debe investigar las soluciones de almacenamiento en caché front-end como parte de su implementación general (memcached, barniz).

Alternativamente, actualice a Apache 2.4 y su evento nativo MPM, que maneja la concurrencia de una manera mucho mejor (los hilos se disparan al momento de la conexión, sin esperar a ser encuestados).

Adaptador
fuente
¿podría ampliar el comentario del evento mpm? ¿Cómo se compara vs mpm-worker?
Sirex
Si bien el MPM de trabajo ya estaba basado en subprocesos y, por lo tanto, es mucho más rápido de iniciar y más ligero de ejecutar, el evento MPM ya no sondea el socket: se le notifica la actividad; por lo tanto, "evento".
Adaptr
¿Entonces debería funcionar mejor en sitios de alto tráfico (13k / seg)?
Sirex
6

Han pasado aproximadamente 3 años desde que se publicó la pregunta, pero recomendaría que vaya con MPM de trabajo en lugar de pre-fork, incluso si usa PHP, para obtener el mejor rendimiento.

En cuanto a las diferencias, la pre-bifurcación no está enhebrada, por lo tanto, el servidor bifurca un proceso para cada solicitud del cliente (se bifurca previamente en anticipación de nuevas solicitudes para que la bifurcación no afecte el tiempo de respuesta). Dado que las solicitudes son del servidor en un proceso separado, esto generalmente grava mucho más su memoria y CPU. El trabajador trae subprocesos múltiples que es más ligero y tiene una mejor utilización de la memoria.

aleemb
fuente
2

Esto es algo muy particular de lo que estás sirviendo. Si está haciendo muchas pequeñas conexiones estáticas, los hilos serían más ligeros y rápidos. Si solo tiene pocas aplicaciones grandes generadas constantemente, prefork podría tener una ventaja debido a su madurez y estabilidad. ¿Por qué no configurar lo que necesita, probar uno, cambiar el módulo MPM, volver a intentarlo y ver cuál le conviene más?

Marcin
fuente
No puede "intercambiar" arbitrariamente el MPM en apache 2.2; se establece en tiempo de compilación.
Adaptr
Puedes hacerlo con apt o RPM. Debian tiene varios paquetes diferentes de Apache 2, dependiendo del estilo que prefiera.
Brendan Byrd
1

que necesita sobre el tipo y tipo de tráfico que tendrá. Y también primero debe comprender la diferencia principal entre prefork y trabajador. ¡Espero que el siguiente artículo te ayude a descubrirlo! http://slashroot.in/how-is-nginx-different-from-apache

sarath
fuente
2
Preferimos respuestas para tener contenido, no enlaces a contenido. Si pudiera proporcionar un resumen de lo que hay en el enlace de destino, esa es la mejor práctica. Link-rot sucede.
sysadmin1138
1
Pregunta fue sobre Apache (nginx no es Apache) y los méritos relativos de prefork o hilos (usos nginx ni)
symcbean