【问题标题】:How to deal with PHP-FPM finishing state?如何处理 PHP-FPM 整理状态?
【发布时间】:2013-11-24 19:04:53
【问题描述】:

我有一个使用 NGINX 和 PHP-FPM 的网站。正如您可能知道的那样,PHP-FPM 有一个关于它的池的状态页面,其中包含有关它的进程的详细信息。 我的问题是,随着时间的推移,许多进程状态变为“完成”,并且在我重新加载 PHP-FPM 之前不会改变它们的“完成”状态。

坏事是“完成”进程算作活动进程,当活动进程的数量超过 pm.max_children 时,我的网站上就会发生坏事。

我知道一些 php-fpm 池参数可以杀死空闲进程,但是我找不到在一定时间后杀死完成进程的参数。

PHP-FPM如何处理整理状态?是否有一个配置参数可以在一段时间后终止这些“完成”进程?这可能是 NGINX 和 PHP-FPM 之间的错误配置吗? “完成”状态的原因是什么?

这是 php-fpm 状态的图像。红军正在完成状态,这就是我要解决的问题。请求 URI 是我网站的不同页面。

感谢您的知识。

PD1:现在我每 15 分钟重新加载一次 PHP-FPM,并且“修复”或多或少的完成状态......但我认为这可能是一个重要的性能问题,因为更多的流量.

PD2: 到目前为止,我认为唯一可行的解​​决方案是读取 php-fpm 状态页面,获取所有具有完成状态的进程,并通过 pid 终止超过任意请求持续时间的进程。

【问题讨论】:

    标签: nginx php


    【解决方案1】:

    遇到了同样的问题。这是我用作临时解决方案的方法:

    创建一个包含内容的 PHP 文件:

    <?php
    fastcgi_finish_request();
    ?>
    

    编辑 php.ini:

    auto_append_file = /path/to/your/file.php
    

    【讨论】:

    • 临时解决方案?你现在用什么?
    【解决方案2】:

    我遇到了这样的问题,这是我的解决方法:

    事实证明我们在某些情况下使用了无效的 Memcached 键 情况。这导致 Memcached 没有错误地死掉,并且 PHP 进程还活着。

    https://serverfault.com/questions/626904/php-fpm-state-finishing-but-never-completes

    【讨论】:

      【解决方案3】:

      评论都没有解决或解释问题背后的根本原因。执行 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,服务器:主机名1 ,请求:“GET /?p=9247 HTTP/1.1”,上游:“fastcgi://uni x:/run/php/php7.0-fpm.sock:",主机:"hostname2"

      明显的不匹配是请求由“hostname1”的块处理,而“hostname2”的块不存在(不再存在)。我不能肯定地说这是原因。即使在声明了 server_name _; 块之后也有“完成”请求,但它们的频率低于之前发生的任何事情。

      【讨论】:

        【解决方案4】:

        我的服务器在 apache 代理配置中有 enablereuse=on 设置。删除它修复了“完成”问题。

        问题中也列出了:https://serverfault.com/questions/626904/php-fpm-state-finishing-but-never-completes

        【讨论】:

          猜你喜欢
          • 2017-07-30
          • 1970-01-01
          • 2013-07-23
          • 2019-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-04
          • 2021-10-25
          相关资源
          最近更新 更多