PHP-FPM löst "pm.max_children" aus, erholt sich aber nie

PHP-FPM löst "pm.max_children" aus, erholt sich aber nie

Ich habe ein Szenario, in dem ich JQuery verwende (ja, ein sehr altes Projekt), das 10 bis 100 HTTP-GET-Anfragen asynchron ausführt. Ich starte sie einfach und überlasse es dem Browser, zu handhaben, wie viele parallel ausgeführt werden. Die Leistung ist mir egal, der Aufruf ist schnell.

Allerdings werden nur wenige Anrufe beendet, der Rest erhält nach etwa einer Minute ein 504 Gateway-Timeout von Nginx. Danach funktioniert „nichts“ mehr (alles erhält ein Timeout).

Die php-fpm-Protokolle enthalten:

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

Klar, das sind standardmäßig 5 (lokale Entwicklung). Natürlich kann ich das auf 100 oder 1000 ändern, aber das will ich nicht wirklich. Ich möchte, dass die Anfragen entweder warten oder beendet werden oder ein Timeout auftritt, aber php-fpm nicht „abstürzen“ lassen.

Für php-fpm verwenden wir Docker php:php-8.1-fpm-alpine. Wir installieren einige Erweiterungen (amqp, gd, imagick, memcached, opcache, xdebug und einige andere . 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 awww.conf`-Dateien für den Pool (das ist also auch nur die Standardeinstellung).

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

Allgemeine Idee der Nginx-Konfiguration (ich kann alles posten, falls nötig)

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

Mein Javascript-Code ist sehr einfach:

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

Der erste mögliche Einstiegspunkt (in unserem Fall: dispatch.php) hat in Zeile 1 ein, die("test")sodass kein echter Code ausgeführt wird.

Also: Ich klicke auf meine Schaltfläche und feuere 100 HTTP-Anfragen ab (in diesem Fall 100 Kontrollkästchen). Ich sehe in meinem Browser, dass 2 bis 4 erfolgreich sind (HTTP 200 mit „Test“ als Antwort). Alle anderen bleiben im Wartezustand hängen und erhalten nach einer Minute eine HTTP 504 von nginx. Ich habe 10 Minuten gewartet, aber selbst danach kann ich immer noch nichts anderes tun. Jedes Laden/Aktualisieren einer Seite führt nach einer Minute zu einer 504.

Ich muss mein PHP-FPM neu starten, damit es wieder funktioniert.

Als Referenz (nachdem das Problem aufgetreten ist):

/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

Meine Frage also: Ist es nicht zu erwarten, dass die Ergebnisse entweder „langsam“ sind, aber abgeschlossen werden, oder beendet werden/ein Timeout auftritt? Aber dann sollte das php-fpm trotzdem funktionieren? Oder ist das irgendwie zu erwarten?

verwandte Informationen