PHP-FPM ondemand: filhos ativos chegam a max_children, então o php para de funcionar

PHP-FPM ondemand: filhos ativos chegam a max_children, então o php para de funcionar

Meu servidor executa 10 sites, tráfego muito baixo. Configuração:

  • Ubuntu 20.04.5LTS
  • Nginx 1.18.0 (Ubuntu)
  • PHP7.4.3

Emnginx.confisto é adicionado:

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

Emhabilitado para sitesos arquivos de configuração têm locais que incluem:

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

Meu/etc/php/7.4/fpm/pool.d/www.conftem:

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

Agora o que acontece é que meus sites estão funcionando bem, mas o arquivo de log do php mostra que o número de filhos ativos está aumentando constantemente. Depois de um ou dois dias, chega a 15 e o PHP para de funcionar. Olhando para a lista de processos, há crianças de todas as “idades” que parecem viver sem propósito. Não há avisos no arquivo de log do PHP, apenas este, quando max_childrené atingido:

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

Tenho tentado ajustar as configurações do PHP. Com pm = dynamic, max_children são alcançados muito mais rapidamente. max_requestsfoi maior no início, mas baixá-lo não fez diferença significativa. Tenho recursos suficientes para aumentar max_childrenum pouco, mas isso só adia o problema, não resolve.

Observe que meu servidor não apresenta problemas de carregamento. O uso de memória nunca excede 35% e a CPU permanece estável em 5%.

Devo estar fazendo algo errado, porque suponho que as crianças deveriam ser mortas em algum momento, não deveriam?O log do PHP diz que crianças estão sendo mortas, mas isso sempre diminui a contagem de crianças sobressalentes, nunca de crianças ativas:

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 típica de processos com crianças de até 15 anos:

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

Responder1

A causa são solicitações lentas de um dos sites instalados.

Existem algumas configurações FPM/NGINX que controlam a vida dos processos filhos. Estas são minhas configurações agora e parecem manter as crianças sob controle:

Em /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 = sim

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

max_execution_time = 30
default_socket_timeout = 60

Em /etc/nginx/nginx.conf:

keepalive_timeout 55;
fastcgi_read_timeout 60;

informação relacionada