
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_children
se 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_requests
Al principio era mayor, pero reducirlo no supuso una diferencia significativa. Tengo recursos suficientes para aumentar max_children
un 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;