Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制异步运行的多个PHP脚本的cpu使用_Php_Bash_Command Line Interface_Cron Task - Fatal编程技术网

限制异步运行的多个PHP脚本的cpu使用

限制异步运行的多个PHP脚本的cpu使用,php,bash,command-line-interface,cron-task,Php,Bash,Command Line Interface,Cron Task,我通过设置cron作业通过CLI运行PHP代码。该脚本从数据库中读取大约10000条记录,并运行10000个新脚本(通过exec命令),而无需等待上一个脚本完成。我使用它是因为我希望所有这些任务都能快速运行。(每次大约需要10秒)。 当正在运行的任务数量变大时,CPU使用率将变为100%,无法与服务器(CentOS)一起工作。如何处理此问题?您需要限制在任何给定时间并行运行的脚本数量,因为运行10000个并发脚本显然会使您的系统饱和。相反,您应该将每个任务排队,并同时处理25或50个(无论什么原

我通过设置cron作业通过CLI运行PHP代码。该脚本从数据库中读取大约10000条记录,并运行10000个新脚本(通过
exec
命令),而无需等待上一个脚本完成。我使用它是因为我希望所有这些任务都能快速运行。(每次大约需要10秒)。

当正在运行的任务数量变大时,CPU使用率将变为100%,无法与服务器(CentOS)一起工作。如何处理此问题?

您需要限制在任何给定时间并行运行的脚本数量,因为运行10000个并发脚本显然会使您的系统饱和。相反,您应该将每个任务排队,并同时处理25或50个(无论什么原因导致合理的负载量)任务

由于不太了解这些脚本的实际工作方式,我无法在代码方面给您提供太多建议,但是您肯定需要有一个队列来限制同时运行的脚本的并发实例的数量


还可以查看信号量,它们可能对这个生产者/消费者模型很有用

我最近写了一个脚本来处理命令的并行执行。它基本上允许操作员在运行时调整并发进程的数量。 如果您觉得CPU使用率太高,只需降低/etc/maxprunning中的值即可

CMD="path-of-your-php-script"


function getMaxPRunning {
    cat /etc/maxprunning
}

function limitProcs {
    PRUNNING=`ps auxw | grep -v grep | grep "$CMD" | wc -l`
    #echo "Now running $PRUNNING processes, MAX:$MAXPRUNNING"
    [ $PRUNNING -ge $MAXPRUNNING ] && {
       sleep 1
       return
    }
    #echo "Launching new process"
    sleep 0.2
    $CMD &
}

MAXPRUNNING=`getMaxPRunning`
C=1
while [ 1 ];do
   MAXPRUNNING=`getMaxPRunning`
   limitProcs
done
如果希望您的php脚本忽略意外父级死亡,请将这一行放在php脚本的顶部

pcntl_signal(SIGINT, SIG_IGN); 

您必须增加RAM大小1)不要运行10000个新脚本,这一点都不聪明,您没有10000个CPU核心。2) 找出你的任务慢的原因——增加脚本的数量并不能使它们更快。如果您正在写入数据库,生成10k脚本不会使其运行得更快。你完全走错了路。@Mjh谢谢你。每个脚本都对外部url执行一个curl命令,并等待响应,然后将它们写入数据库。我需要每个请求的答复。我只是想核实一下。我有一个未来的决定,就是使用nodejs通过队列来处理这个问题。难道你不能使用Guzzle来执行异步http请求,然后在promise函数中执行写入db的任务吗?如果你可以批处理这个问题,效果会更好,但还有其他替代方法,比如command
nice
。您可以设置ScriptsHank You@edhurtig的优先级。我试图限制异步调用的数量。但问题是,如果我一起运行10000个脚本,CPU使用率将在大约10分钟内达到100%(例如),如果我在一个CPU上运行25个脚本,CPU使用率将在大约10秒钟内达到100%。问题仍然存在。然后,您可能需要使用多核处理器,并将CPU afinity设置为内核的上半部分(或类似的内容)。您还可以将进程优先级设置为非常低。您的CPU仍将达到最大值,但当您做其他事情时,进程调度器将从CPU上取下这些指示器。我也同意@mjh,如果所有这些脚本都是卷曲的,那么我建议使用Guzzle或其他同步http请求技术。您可能仍然会导致高CPU负载,如果是这样,那么我关于CPU相关性和进程优先级的评论应该会有所帮助