23

我在 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 现在唯一一次启动是当它真正找到工作要做然后触发命令时,我很好。

4

3 回答 3

14

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

然而,这个好处也有一个缺点——部署代码时需要特别小心,并且必须注意数据库连接。通常,长时间运行的数据库连接会断开。

于 2014-08-26T06:45:16.567 回答
5

我遇到过同样的问题。

但我找到了另一个解决方案。我按原样使用工匠工人,但我修改了“手表”时间。默认情况下(来自 laravel)这个时间被硬编码为零,我已将此值更改为 600(秒)。查看文件:'vendor/laravel/framework/src/Illuminate/Queue/BeanstalkdQueue.php' 和函数'public function pop($queue = null)'

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

==> 没有投票了!

笔记:

  • 它不适用于 Iron.io 队列或其他队列。
  • 当您希望 1 个工作人员接受来自多个队列的作业时,它可能不起作用。
于 2013-06-18T20:10:14.950 回答
2

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

于 2013-10-12T17:15:05.973 回答