为什么我的 PHP-FPM 子进程在请求完成后没有立即恢复到空闲状态?

为什么我的 PHP-FPM 子进程在请求完成后没有立即恢复到空闲状态?

我正在尝试调试在 K8s 上运行 Laravel 应用程序时的服务器锁定。我有 2 个 pod,每个 pod 有 100 个静态子节点,并且正在运行负载测试。正如预期的那样,在施加负载时,子节点会接收请求(该请求是一个简单的主页页面加载 - 我正在使用全新的 Laravel 应用程序来排除任何应用程序逻辑是罪魁祸首),但进程似乎直到超时才会结束(当前默认设置为 300 秒)。在这种行为下,所有子节点似乎都比请求持续时间运行的时间长得多。这是预期的行为吗?如果不是,有谁知道为什么子节点在请求完成后没有转换为空闲状态?

在此处输入图片描述

FPM 池配置:

[www]

user = application
group = application

listen = 127.0.0.1:9000

pm = static
pm.max_children = 100
pm.max_requests = 200

pm.status_path = /status
access.log = /docker.stdout

access.format = "[php-fpm:access] %R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"

slowlog = /docker.stderr
request_slowlog_timeout = 1

catch_workers_output = yes
clear_env = no

php_admin_value[error_log] = /docker.stderr
php_admin_flag[log_errors] = on
php_admin_value[log_errors] = on

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i

更新

根据迈克尔·汉普顿 (Michael Hampton) 的建议,我通过在文件顶部添加以下内容来拦截 Laravel 框架/routes/web.php

echo("<h1>Hello Kubernetes</h1>");
die();

现在,当执行负载测试(这次只有一个 pod)时,行为就更容易接受了,这让我相信问题出在 Laravel 项目上。因为这是一个全新安装,所以我的下一步是查看我从.env有问题的项目中重用的文件,看看那里是否有任何罪魁祸首。欢迎提出任何有关如何调试此问题的建议!

在此处输入图片描述

更新2 在框架中删除上述拦截后,请求又恢复无休止。由于这看起来像是 Laravel 的问题,我将把这个问题提交给 StackOverflow。

在此处输入图片描述

答案1

对于遇到同样问题的人来说,这是由于我的 Redis 连接。通过移动到database会话和缓存驱动程序,FPM 进程将按预期关闭。我不确定 Redis 驱动程序为何保持连接打开,但不幸的是,我现在没有能力对其进行调试。

相关内容