PHP-FPM aciona “pm.max_children”, mas nunca se recupera

PHP-FPM aciona “pm.max_children”, mas nunca se recupera

Eu tenho um cenário em que uso algum JQuery (sim, um projeto muito antigo) que faz de 10 a 100 solicitações HTTP GET assíncronas. Eu apenas os disparo e deixo o navegador controlar quantos estão sendo feitos em paralelo. Não me importo com o desempenho, a ligação é rápida.

No entanto, apenas algumas chamadas serão concluídas, o restante receberá um tempo limite do Gateway 504 do Nginx após cerca de um minuto. Depois disso, "nada" funciona (tudo atinge o tempo limite).

Os logs do php-fpm contêm:

2023-09-20T14:42:16.773528255Z [20-Sep-2023 14:42:16] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

Claro, isso é 5 por padrão (desenvolvimento local). Claro, posso mudar isso para 100 ou 1000, mas realmente não quero isso. Quero que as solicitações esperem, terminem ou expirem, mas não "travem" o php-fpm.

Para o php-fpm usamos docker php:php-8.1-fpm-alpine. Instalamos algumas extensões (amqp, gd, imagick, memcached, opcache, xdebug e alguns outros . If needed I can retry/rewrite things to be able to test this in a "clean" environment. The PHP config is the default one. I do NOT have aarquivos www.conf` para o pool (então isso também é apenas o padrão).

docker-compose.yaml

  phpfpm:
    image: our-own-registry
    ports:
      - 9000
    environment:
      xx: xx
    volumes:
      - .:/opt/project
      - ./cachegrinds/:/tmp/cachegrinds
  nginx:
    image: our-own-registry
    volumes:
      - ./config/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - ./css:/opt/project/css
      - ./js:/opt/project/js
      - ./images:/opt/project/images
      - ./font:/opt/project/font
    ports:
      - 8880:80
      - 8443:443
    links:
      - phpfpm

Ideia geral da configuração do nginx (posso postar tudo se necessário)

server {
  listen *:80;
  listen [::]:80;
  listen *:443 ssl http2;
  listen [::]:443 ssl http2;
  server_name xx;

  root /opt/project;

    location /
      {
      client_max_body_size 10M;
      rewrite .* /dispatch.php break;

      include fastcgi_params;
      fastcgi_pass phpfpm:9000;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      }

Meu código javascript é muito simples:

        $(".remove-checkbox:checkbox:checked").each(function () {
            $.get("file.php?action=xx, function () {
                console.log("ok");
            }).fail(function () {
                console.log("fail");
            })
        });

O primeiro ponto de entrada possível (no nosso caso: dispatch.php) possui na linha 1 a, die("test")portanto nenhum código real é executado.

Então: clico no meu botão e disparo 100 solicitações http (100 caixas de seleção neste caso). Vejo no meu navegador que 2 a 4 foram bem-sucedidos (HTTP 200 com "teste" como resposta). Todos os outros ficam pendentes e depois de um minuto recebem um HTTP 504 do nginx. Esperei 10 minutos, mas mesmo depois desse tempo ainda não consigo fazer mais nada. Qualquer carregamento/atualização de página resultará em 504 após um minuto.

Preciso reiniciar meu php-fpm para fazê-lo funcionar novamente.

Para referência (depois que o problema aconteceu):

/var/www/html # ps auxf
PID   USER     TIME  COMMAND
    1 root      0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)
    6 www-data  0:00 php-fpm: pool www
    7 www-data  0:00 php-fpm: pool www
    8 www-data  0:00 php-fpm: pool www
    9 www-data  0:00 php-fpm: pool www
   10 www-data  0:00 php-fpm: pool www
   11 root      0:00 /bin/sh
   17 root      0:00 ps auxf

Então, minha pergunta: não é esperado que os resultados sejam "lentos", mas terminem ou terminem/esgotem o tempo limite? Mas então o php-fpm ainda deve funcionar? Ou isso é de alguma forma esperado?

informação relacionada