PHP-FPM bajo demanda: los niños activos ascienden hasta max_children, luego php deja de funcionar

PHP-FPM bajo demanda: los niños activos ascienden hasta max_children, luego php deja de funcionar

Mi servidor ejecuta 10 sitios web, con muy poco tráfico. Configuración:

  • Ubuntu 20.04.5 LTS
  • Nginx 1.18.0 (Ubuntu)
  • PHP 7.4.3

Ennginx.confse agrega esto:

        upstream local_php {
                server unix:/run/php/php7.4-fpm.sock;
        }

Ensitios habilitadosLos archivos de configuración tienen ubicaciones que incluyen:

        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass local_php;
                fastcgi_buffers 16 16k;
                fastcgi_buffer_size 32k;
        }

Mi/etc/php/7.4/fpm/pool.d/www.conftiene:

pm = ondemand
pm.max_children = 15
pm.max_requests = 10

Ahora lo que sucede es que mis sitios funcionan bien, pero el archivo de registro php muestra que la cantidad de niños activos aumenta constantemente. Después de aproximadamente un día, llega a 15 y luego PHP deja de funcionar. Al observar la lista de procesos, hay niños de todas las "edades" que parecen vivir sin ningún propósito. No hay advertencias en el archivo de registro de PHP, sólo esta, cuando max_childrense alcanza:

WARNING: pid 75057, fpm_pctl_on_socket_accept(), line 518: [pool www] server reached max_children setting (15), consider raising it

He estado intentando modificar la configuración de PHP. Con pm = dynamic, se alcanza max_children mucho más rápido. max_requestsAl principio era mayor, pero reducirlo no supuso una diferencia significativa. Tengo recursos suficientes para aumentar max_childrenun poco, pero eso sólo pospone el problema, no lo soluciona.

Tenga en cuenta que mi servidor no tiene problemas de carga. El uso de memoria nunca supera el 35% y la CPU se mantiene estable en el 5%.

Algo debo estar haciendo mal, porque supongo que los niños deberían ser asesinados en algún momento, ¿no?El registro de PHP dice que se están matando niños, pero esto siempre disminuye el recuento de niños sobrantes, ni siquiera de niños activos:

DEBUG: pid 232350, fpm_pctl_perform_idle_server_maintenance(), line 365: [pool www] currently 8 active children, 2 spare children
DEBUG: pid 232350, fpm_got_signal(), line 82: received SIGCHLD
DEBUG: pid 232350, fpm_event_loop(), line 435: event module triggered 1 events
DEBUG: pid 232350, fpm_children_bury(), line 261: [pool www] child 289966 has been killed by the process management after 12.069386 seconds from start
DEBUG: pid 232350, fpm_pctl_perform_idle_server_maintenance(), line 365: [pool www] currently 8 active children, 1 spare children
DEBUG: pid 232350, fpm_got_signal(), line 82: received SIGCHLD
DEBUG: pid 232350, fpm_event_loop(), line 435: event module triggered 1 events
DEBUG: pid 232350, fpm_children_bury(), line 261: [pool www] child 289969 has been killed by the process management after 12.665847 seconds from start
DEBUG: pid 232350, fpm_pctl_perform_idle_server_maintenance(), line 365: [pool www] currently 8 active children, 0 spare children

Lista de procesos típicos con niños de hasta 15 años:

1390 vps@vps9029:/etc/php/7.4/fpm/pool.d $ ps -elf|grep php
4 S root    15528   15439  0  80   0 -  2397 -      Dec20 pts/1 00:00:00 sudo tail -f php7.4-fpm.log
4 S root    15537   15528  0  80   0 -  1378 -      Dec20 pts/1 00:00:12 tail -f php7.4-fpm.log
4 S root    75057       1  0  80   0 - 59077 -      Dec21 ?     00:00:26 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
5 S www-data   94817   75057  0  80   0 - 84357 -   Dec21 ?     00:00:00 php-fpm: pool www
5 S www-data  104885   75057  0  80   0 - 84302 -   Dec21 ?     00:00:00 php-fpm: pool www
5 S www-data  125566   75057  0  80   0 - 66282 -   Dec21 ?     00:00:01 php-fpm: pool www
5 S www-data  143879   75057  0  80   0 - 65617 -   02:47 ?     00:00:00 php-fpm: pool www
5 S www-data  149198   75057  0  80   0 - 84441 -   03:56 ?     00:00:00 php-fpm: pool www
5 S www-data  149632   75057  0  80   0 - 84582 -   04:02 ?     00:00:08 php-fpm: pool www
5 S www-data  152959   75057  0  80   0 - 84515 -   04:43 ?     00:00:01 php-fpm: pool www
5 S www-data  178687   75057  0  80   0 - 65673 -   09:53 ?     00:00:00 php-fpm: pool www
5 S www-data  182987   75057  0  80   0 - 84178 -   10:46 ?     00:00:00 php-fpm: pool www
5 S www-data  187712   75057  0  80   0 - 84178 -   11:44 ?     00:00:00 php-fpm: pool www
5 S www-data  187713   75057  0  80   0 - 84178 -   11:44 ?     00:00:00 php-fpm: pool www
5 S www-data  197529   75057  0  80   0 - 84386 -   13:59 ?     00:00:00 php-fpm: pool www
5 S www-data  210404   75057  0  80   0 - 65569 -   16:48 ?     00:00:00 php-fpm: pool www
5 S www-data  213858   75057  0  80   0 - 65633 -   17:29 ?     00:00:00 php-fpm: pool www
5 S www-data  214975   75057  0  80   0 - 85465 -   17:44 ?     00:00:00 php-fpm: pool www

Respuesta1

La causa son las solicitudes lentas de uno de los sitios instalados.

Hay bastantes configuraciones de FPM/NGINX que controlan la vida de los procesos secundarios. Estas son mis configuraciones ahora y parecen tener a los niños bajo control:

En /etc/php/7.4/fpm/pool.d/www.conf:

pm = ondemand
pm.max_requests = 10
pm.max_children = 15
pm.process_idle_timeout = 10s
request_terminate_timeout = 60s
  • request_terminate_timeout_track_finished = sí

En /etc/php/7.4/fpm/php.ini:

max_execution_time = 30
default_socket_timeout = 60

En /etc/nginx/nginx.conf:

keepalive_timeout 55;
fastcgi_read_timeout 60;

información relacionada