PHP5-FPM y 'ondemand'

4

He configurado un servidor con Nginx y PHP5-FPM, y las cosas están funcionando bien. Sin embargo, a medida que agrego más y más sitios al servidor, veo que el uso de memoria aumenta constantemente, y llegué a la conclusión de que PHP5-FPM es el "culpable".

Lo que hago actualmente es configurar un grupo PHP5-FPM separado para cada sitio, y configurar ese grupo de acuerdo con el tráfico esperado. Sin embargo, con suficientes sitios, al final tendré un servidor que solo incluye una gran cantidad de "hijos" PHP5-FPM que solo esperan el trabajo.

Me acabo de enterar del modo PHP5-FPM ondemand , que me permite configurar PHP5-FPM de manera que los procesos secundarios se bifurcan solo cuando realmente se necesitan, y luego se mantienen vivos durante un tiempo determinado para procesar.

Sin embargo, realmente no puedo encontrar demasiados detalles sobre esto. Lo que más me interesa es cómo las variables pm.max_children y pm.max_requests afectan el modo ondemand (si es que lo hay). Supongo que las variables pm.start_servers , pm.min_spare_servers , pm.max_spare_servers no se aplican al modo ondemand .

sbrattla
fuente
En este enlace se enumeran las configuraciones posibles y se detalla cada una de ellas. Encontrará una respuesta a cada configuración específica de la que tenga dudas. Ayuda de configuración oficial de PHP-FPM
Leonardo Jauregui

Respuestas:

11

tienes razón, start_servers, min_spare_servers y max_spare_servers no se aplican al modo ondemand. Las siguientes variables son las que se aplican al modo ondemand:

  • pm.max_children
  • pm.process_idle_timeout
  • pm.max_requests

Cuando configura pm = ondemand, FPM bifurcará a los niños tan pronto como lo necesite, manteniendo siempre el número de niños menor o igual a pm.max_children, por lo que esta variable es un límite superior en el número de niños bifurcados al mismo tiempo.

Las otras dos variables le permiten especificar cuándo un niño tiene que ser destruido:

  • pm.process_idle_timeout establece el tiempo que un niño espera sin trabajar antes de ser destruido. Se define en segundos.

  • pm.max_requests define cuántas solicitudes (una a la vez) procesará un niño antes de que se destruya. Por ejemplo, si establece esta variable en un valor de 50, un elemento secundario procesará 50 solicitudes y se cerrará. Si el proceso maestro de FPM todavía necesita otros hijos, se bifurcará uno nuevo.

En mi empresa utilizamos el modo ondemand en FPM, y utilizamos pm.max_requests para forzar el reciclaje de niños fpm y evitar el uso de memoria.

Espero que esto ayude,

Saludos.

Juan Traverso
fuente
¡Gracias por tu contribución! En su experiencia, ¿cuál es un valor razonable para pm.process_idle_timeout?
sbrattla
2
Nuestro valor predeterminado en cada nueva configuración es 50. Sin embargo, he realizado pruebas en valores cada vez más bajos. Personalmente, no iré por debajo de 15 o 10, porque causa tantos eventos de muerte / bifurcación y disminuye el rendimiento. Por otro lado, creo que valores superiores a 100/150 son demasiado altos para nuestro modelo de reciclaje forzado.
Juan Traverso
1

Puede ser este error https://bugs.php.net/bug.php?id=72935

TLDR; Si dos clientes se conectan a PHP-FPM en modo ondemand en el mismo socket Unix antes de que se acepte accept () en el hijo, solo uno obtiene accept () ed.

J. Nick Koston
fuente