PHP-FPM запускает «pm.max_children», но не восстанавливается

PHP-FPM запускает «pm.max_children», но не восстанавливается

У меня есть сценарий, в котором я использую JQuery (да, очень старый проект), который выполняет 10~100 HTTP GET-запросов асинхронно. Я просто запускаю их и позволяю браузеру обрабатывать, сколько из них выполняется параллельно. Мне не важна производительность, вызов быстрый.

Однако только несколько вызовов завершаются, остальные примерно через минуту получат таймаут Gateway 504 от Nginx. После этого "ничего" не работает (все получает таймаут).

Логи php-fpm содержат:

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

Конечно, это 5 по умолчанию (локальная разработка). Конечно, я могу изменить это на 100 или 1000, но мне это не очень нужно. Я хочу, чтобы запросы либо ждали, либо завершались, либо истекали по тайм-ауту, но не «вызывали крах» php-fpm.

Для php-fpm мы используем docker php:php-8.1-fpm-alpine. Мы устанавливаем несколько расширений (amqp, gd, imagick, memcached, opcache, xdebug и несколько других) . 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 aфайл www.conf для пула (так что это тоже просто по умолчанию).

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

Общая идея конфигурации nginx (могу выложить все, если нужно)

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

Мой код JavaScript очень прост:

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

Первая возможная точка входа (в нашем случае: dispatch.php) имеет строку 1, die("test")поэтому реальный код не выполняется.

Итак: я нажимаю кнопку, отправляю 100 http-запросов (в данном случае 100 флажков). Вижу в браузере, что 2~4 успешно выполняются (HTTP 200 с ответом "test"). Все остальные зависают в режиме ожидания и через минуту получают HTTP 504 от nginx. Я подождал 10 минут, но даже после этого времени я все еще не могу ничего сделать. Любая загрузка/обновление страницы приведет к 504 через минуту.

Мне нужно перезапустить php-fpm, чтобы он снова заработал.

Для справки (после возникновения проблемы):

/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

Итак, мой вопрос: разве не ожидается, что результаты будут "медленными", но завершатся, или завершатся/прекратятся по тайм-ауту? Но тогда php-fpm все равно должен работать? Или это как-то ожидается?

Связанный контент