【问题标题】:How to limit number of processes?如何限制进程数?
【发布时间】:2010-09-24 11:59:40
【问题描述】:

在我的 PHP Web 应用程序中,我试图限制运行的 CPU/内存密集型进程的数量(例如,ImageMagick 的“转换”命令)。我有许多执行各种脚本的 crons 作业,这些脚本可能会执行这些 CPU/内存密集型进程的太多实例。

在尝试限制此类进程时,我首先检查我的系统是否已经在运行一定数量的进程。功能:

function has_reached_process_limit($process, $limit)
{
    $command = 'ps -eo comm | grep ' . $process;
    exec($command, $output, $return);
    if (count($output) > $limit)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}   

所以,我运行的是这样的:

while (has_reached_process_limit('convert', 5) === TRUE)
{
   // loop over
}

问题是,当我监控操作系统的资源时(通过“top”命令),我看到的进程比我预期的要多得多。任何想法为什么?

【问题讨论】:

  • 您指的这些更多流程是什么?例子?
  • 我认为这是因为ps 也显示了线程和分叉。因此,如果其中一个 imagemagick 进程使用 3 个线程,它将显示 3 次。这可能是问题所在,但我不确定您将如何解决它。不过老实说,请按照下面的答案进行工作队列。

标签: php linux concurrency


【解决方案1】:

我认为更好的方法是作业控制器或作业队列... 但是,如果那对您来说是不可能的,因为您的东西是如此分开,您的方法看起来很糟糕。但是我可以从这里告诉你,你的 ps 命令应该总是返回“php”,这可能更好地检查执行的文件或用户或其他东西?

您在谈论哪些其他流程? php进程?他们看起来像什么,执行?您也可以查看此链接http://www.php.net/manual/en/function.sem-get.php

【讨论】:

    【解决方案2】:

    对于这个用例,php 有信号量扩展

    resource sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] )

    http://www.php.net/manual/en/function.sem-get.php

    我认为这可以满足您的需求,但信号量不是日常扩展,所以我可能需要通过 php 中的--enable-sysvsem 开关安装它

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 1970-01-01
      • 2011-03-13
      • 2022-12-10
      • 2011-05-31
      • 2018-09-30
      • 1970-01-01
      • 2016-08-25
      • 2012-03-27
      相关资源
      最近更新 更多