[英]How to deal with PHP-FPM finishing state?
我有一个使用NGINX和PHP-FPM的网站。 您可能知道PHP-FPM有一个状态页面,其中包含有关其进程的详细信息。 我的问题是,随着时间的推移,许多进程状态变为“完成”,并且在我重新加载PHP-FPM之前不会改变它们的“完成”状态。
糟糕的是,“完成”过程被视为活动过程,当活动过程的数量超过pm.max_children时,我的网站上发生了不好的事情。
我知道一些php-fpm池参数来杀死空闲进程,但我找不到参数来杀死一段时间后完成proccesses。
如何处理PHP-FPM整理状态? 是否有配置参数在一段时间后终止这些“完成”过程? 这可能是NGINX和PHP-FPM之间的错误配置吗? “完成”状态的原因是什么?
这是php-fpm状态的图像。 红军正在完成状态,这正是我想要解决的问题。 请求URI是我网站的不同页面。
谢谢你的知识。
PD1:现在我每15分钟重新加载PHP-FPM并且“修复”或多或少完成状态...但我认为这可能是一个重要的性能问题,流量更多。
PD2:到目前为止,我认为可以解决的唯一解决方案是读取php-fpm状态页面,获取所有具有完成状态的procceses并通过pid杀死proccesses超过任意请求持续时间。
有同样的问题。 这是我用作临时解决方案的内容:
使用以下内容创建一个PHP文件:
<?php
fastcgi_finish_request();
?>
编辑php.ini:
auto_append_file = /path/to/your/file.php
我有这样的问题,这是我的修复:
事实证明我们在某些情况下使用了无效的Memcached密钥。 这导致Memcached死亡而没有错误,PHP进程仍然活着。
https://serverfault.com/questions/626904/php-fpm-state-finishing-but-never-completes
这两个评论都没有解决或解释问题背后的根本原因。 在杀死这些进程时执行PD2方法的示例代码应该是这样的:
<?php
while (true) {
$data_json = file_get_contents("http://localhost/fpmstatus?json&full");
$data = json_decode($data_json, true);
foreach ($data['processes'] as $proc) {
if ($proc['state'] === "Finishing") {
$pid = $proc['pid'];
$duration = $proc['request duration'] / 1000000.0;
echo json_encode(compact("pid", "duration"));
if ($duration > 60) {
passthru("kill -9 " . $pid);
echo " KILLED\n";
} else {
echo "\n";
}
}
}
echo count($data['processes']);
echo "\n";
sleep(30);
}
运行此代码时,我确实发现error.log中会出现这样的错误:
2017/08/06 13:46:42 [错误] 20#20:* 9161 recv()失败(104:通过对等方重置连接)从上游读取响应头,客户端:77.88.5.19,server:hostname1,request: “GET /?p = 9247 HTTP / 1.1”,上游:“fastcgi:// uni x:/run/php/php7.0-fpm.sock:”,主机:“hostname2”
显而易见的不匹配是请求由“hostname1”的块处理,而“hostname2”的块不再存在(不再)。 我不能肯定地说这是原因。 在声明server_name _;
之后,还有“完成”请求server_name _;
阻止,但它们比之前发生的任何事情都要少。
我的服务器在apache代理配置中设置了enablereuse = on。 删除此修复了“整理”问题。
也列在问题中: https : //serverfault.com/questions/626904/php-fpm-state-finishing-but-never-completes
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.