php5-fpm: el servidor alcanzó pm.max_children

41

Tengo Nginx + php5-fpm . Varias veces por hora mi sitio web se atasca y en el archivo de registro veo lo siguiente:

ADVERTENCIA: el servidor [pool www] alcanzó la configuración pm.max_children (5), considere aumentarlo.

El archivo /etc/php5/fpm/pool.d/www.conf contiene la siguiente configuración:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Servidor: AMD Opteron ™ 3280, Octo-Core, 8x 2.4 GHz, 16 GB DIMM (DDR3).

No tengo idea de qué números debo poner en el archivo www.conf para este servidor. ¿Me puede ayudar a alguien? Gracias

usuario1821484
fuente

Respuestas:

40

Hay muchas razones posibles por las que su PHP-FPM alcanzaría el max_children. Los más comunes son:

  • Muchas solicitudes paralelas de sus clientes
  • Ejecución lenta de los scripts PHP
  • Ajuste muy bajo de la max_children

Mirando las especificaciones de su máquina, suponiendo que no haya nada más que PHP + Nginx ejecutándose, creo que podría configurarlo mucho más alto que 5. Dice que tiene 8 núcleos, generalmente Nginx necesita mucho menos CPU que PHP, por lo que con 5 hijos probablemente nunca podrás usarlos todos. Por lo general, lo configuro en algo como el número de núcleos x 2 o el número de núcleos x 4 , dependiendo del consumo de memoria de sus scripts PHP.

repetición
fuente
Es un sitio web de citas con chat php y los usuarios envían millones de mensajes instantáneos. Anoche, cuando tenía ~ 300 usuarios en línea, el comando netstat -an | grep 80 | wc - el resultado fue casi 400.
user1821484
1
De hecho, tengo un sitio web de citas similar. Creo que definitivamente necesitas más hijos PHP. Mi configuración es la siguiente: 20k usuarios en línea concurrentes, 12 máquinas PHP con 8 núcleos cada una, 32 trabajadores en cada una de las máquinas PHP. Eso funciona bastante bien. También debe observar cuánta memoria libre tiene, sospecho que tiene algo, a menos que su PHP sea enorme. Si tiene memoria libre, ¿por qué no usarla para algunos trabajadores más?
reproducir
@ user1821484 Esto es correcto; pm.max_childrenes demasiado baja . Un valor de 10 es razonable para un pequeño servidor VPS con 1 GB de RAM; Tienes un servidor mucho más grande. Aumente este valor hasta que deje de recibir los errores, luego vuelva a aumentarlo en caso de que obtenga un pico de tráfico.
Michael Hampton
Gracias por las respuestas Aumenté la configuración de pm.max_children a 10 y ahora comencé a recibir este error: ADVERTENCIA: [pool www] parece ocupado (es posible que necesite aumentar pm.start_servers o pm.min / max_spare_servers), generando 16 hijos, hay 0 inactivo, y 8 niños en total. ¿Alguien puede sugerirme lo que necesito aumentar? Gracias.
user1821484
núcleos x 2 o núcleos x 4 me suena muy bajo. Tengo una máquina con 8 núcleos y 8 GB de RAM con pm.max_children = 48 y todavía recibimos advertencias de pm.max_children al servidor . Esta máquina no está cerca de sus límites de CPU o memoria. Creo que un mejor enfoque sería optimizar esta configuración junto con la configuración correspondiente de nginx (o apache) y elegir un valor después de determinar cuánta memoria consume cada proceso PHP.
S. Imp
19

Descubrí que al configurar el valor de pm.max_requests (que está comentado por defecto) ayudó a corregir estos errores. Esta configuración obliga a las solicitudes secundarias a reaparecer después de ejecutar un cierto número de solicitudes y puede ser útil si hay pérdidas de memoria en algún lugar de su código o bibliotecas de terceros.

En /etc/php-fpm.d/www.conf :

pm.max_requests = 500
Tom Jowitt
fuente
13

Este enlace puede ser útil: explica cómo calcular el número de procesos secundarios en función de la cantidad de memoria en el sistema:

HTF
fuente
77
Esta respuesta será inútil una vez que ese enlace desaparezca.
miken32
2
Básicamente, el enlace dice ... El valor apropiado para pm.max_children se puede calcular como: pm.max_children = RAM total dedicada al servidor web / Tamaño máximo del proceso hijo
jaywhy13