繁体   English   中英

如何处理PHP-FPM整理状态?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM