我通过设置cron-job通过CLI运行PHP代码。该脚本从数据库中读取大约10000条记录,并运行10000个新脚本(通过exec
命令),而无需等待以前的脚本完成。我使用它是因为我希望所有这些任务都快速运行。 (每个大约需要10秒钟)
当正在运行的任务数量变大时,CPU使用率变为100%并且无法与服务器(CentOS)一起使用。我怎么处理这个?
答案 0 :(得分:0)
您需要限制在任何给定时间并行运行的脚本数,因为运行10,000个并发脚本显然会使系统饱和。相反,您应该排队每个任务并同时处理25或50(无论是什么导致合理的负载量)任务。
如果没有太多关于这些脚本实际工作的知识,我不能真正给你提供很多代码建议,但你肯定需要有一个队列来限制同时运行的脚本的并发实例数时间。
同时检查信号量,它们可能对此生产者/消费者模型有用
答案 1 :(得分:0)
我最近编写了一个脚本,用于处理命令的并行执行。它基本上允许操作员在运行时调整并发进程的数量。 如果您认为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);