PHP-FPM activa "pm.max_children" pero nunca se recupera

PHP-FPM activa "pm.max_children" pero nunca se recupera

Tengo un escenario en el que uso algo de JQuery (sí, un proyecto muy antiguo) que realiza entre 10 y 100 solicitudes HTTP GET de forma asíncrona. Simplemente los disparo y dejo que el navegador maneje cuántos se realizan en paralelo. No me importa el rendimiento, la llamada es rápida.

Sin embargo, solo unas pocas llamadas finalizan, el resto obtendrá un tiempo de espera de puerta de enlace 504 de Nginx después de aproximadamente un minuto. Después de eso, "nada" funciona (todo tiene un tiempo de espera).

Los registros de php-fpm contienen:

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, eso es 5 por defecto (desarrollo local). Por supuesto, puedo cambiar eso a 100 o 1000, pero realmente no quiero eso. Quiero que las solicitudes esperen, finalicen o expiren, pero no "bloqueen" php-fpm.

Para php-fpm usamos docker php:php-8.1-fpm-alpine. Instalamos algunas extensiones (amqp, gd, imagick, memcached, opcache, xdebug y algunas otras, . 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 ael archivo www.conf` para el grupo (por lo que también es el predeterminado).

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

Idea general de la configuración de nginx (puedo publicarla si es necesario)

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;
      }

Mi código javascript es muy simple:

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

El primer punto de entrada posible (en nuestro caso: dispatch.php) tiene en la línea 1 a, die("test")por lo que no se ejecuta ningún código real.

Entonces: hago clic en mi botón y activo 100 solicitudes http (100 casillas de verificación en este caso). Veo en mi navegador que 2 ~ 4 tienen éxito (HTTP 200 con "prueba" como respuesta). Todos los demás están atascados en pendiente y después de un minuto obtienen un HTTP 504 de nginx. Esperé 10 minutos pero incluso después de ese tiempo todavía no puedo hacer nada más. Cualquier carga/actualización de página generará un 504 después de un minuto.

Necesito reiniciar mi php-fpm para que vuelva a funcionar.

Como referencia (después de que ocurrió el problema):

/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

Entonces mi pregunta: ¿No se espera que los resultados sean "lentos" pero finalicen o finalicen/se agoten el tiempo de espera? ¿Pero entonces php-fpm debería seguir funcionando? ¿O se espera esto de alguna manera?

información relacionada