Laravel Artisan Queues - 高CPU使用率

时间:2013-06-03 13:32:33

标签: laravel laravel-4 supervisord beanstalkd

我已经在Laravel中为我的处理脚本设置了队列。 我正在使用beanstalkd和supervisord。 有6种不同的管用于不同类型的加工。

问题在于,对于每一根管子,工匠每秒都在不断地产生工人。 工作人员代码似乎睡了1秒,然后工作线程使用7-15%cpu,乘以6管......我想每管有多个工作人员......我的cpu正在被吃掉。

我尝试将1秒睡眠时间改为10秒。 这有助于但是当工人们醒来时,每10秒仍有一个巨大的CPU峰值。 我现在甚至没有处理任何事情,因为队列完全是空的,只是工人正在寻找可以做的事情。

当我在浏览器中刷新页面并且徘徊在10%左右时,我还测试了laravel的cpu使用情况。我现在正处于低端机架空间实例上,这样可以解释它但仍然......看起来工人们每次醒来时都会旋转一个laravel实例。

有没有办法解决这个问题?我是否只需要将更多的钱投入到更昂贵的服务器中,以便能够听取工作是否准备就绪?

编辑:

找到一个解决方案......不使用工匠队列:监听器或队列:工作 我查看了队列代码,似乎没有解决这个问题的方法,每次工作人员检查更多工作时都需要加载laravel。

相反,我使用pheanstalk编写了自己的监听器。 我仍在使用laravel将事物推入队列,然后我的自定义侦听器正在解析队列数据,然后触发一个artisan命令来运行。

现在我的监听器的cpu使用率在%0以下,我的cpu现在唯一一次出现的时候是它实际找到工作然后触发命令,我很好。

3 个答案:

答案 0 :(得分:13)

引起高CPU的问题是因为工作人员每次检查队列中的作业时都会加载完整的框架。在laravel 4.2中,您可以使用php artisan queue:work --daemon。这将加载框架一次,并且在while循环内进行作业的检查/处理,这使CPU可以轻松呼吸。您可以在官方文档中找到有关守护进程工作者的更多信息:http://laravel.com/docs/queues#daemon-queue-worker

但是,这种好处带来了一个缺点 - 在部署代码时需要特别小心,并且必须处理数据库连接。通常,长时间运行的数据库连接会断开连接。

答案 1 :(得分:5)

我遇到了同样的问题。

但我找到了另一种解决方案。我按原样使用了工匠工人,但我修改了“观察”时间。默认情况下(从laravel)这个时间硬编码为零,我已将此值更改为600(秒)。看文件:     '供应商/ laravel /框架/ SRC /照亮/队列/ BeanstalkdQueue.php' 并在功能     'public function pop($ queue = null)'

所以现在工作也在听队列10分钟。当它没有作业时,它会退出,并且主管正在重新启动它。当它收到一个作业时,它会在它存在之后执行它,并且主管正在重新启动它。

==>没有投票了!

备注:

  • 它不适用于iron.io队列或其他人。
  • 当您希望1名工作人员接受来自1个以上队列的作业时,它可能不起作用。

答案 2 :(得分:2)

根据此commit,您现在可以为queue:listen "--sleep={int}"设置一个新选项,以便您在轮询新作业之前微调等待的时间。
此外,默认设置为3而不是1。