PHP-FPM 触发“pm.max_children”但从未恢复

PHP-FPM 触发“pm.max_children”但从未恢复

我有一个场景,我使用一些 JQuery(是的,一个非常古老的项目),它异步执行 10~100 个 HTTP GET 请求。我只是触发它们,让浏览器处理有多少个正在并行执行。我不关心性能,调用很快。

但是只有少数调用会完成,其余调用会在大约一分钟后从 Nginx 收到 504 网关超时错误。此后“什么”都不起作用(所有调用都会超时)。

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 和其他一些www.conf 文件)(因此这也只是默认设置)。. 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

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,回复为“测试”)。所有其他请求都处于待处理状态,一分钟后从 nginx 收到 HTTP 504。我等了 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 应该仍然可以工作?或者这是预料之中的?

相关内容