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 .
Respuestas:
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:
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.
fuente
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.
fuente