Laravel Artisan Queues - 高CPU使用率

bsp*_*ino 17 beanstalkd supervisord laravel laravel-4

我在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现在唯一的时间就是当它实际找到工作然后触发命令时,我很好.

Moh*_*ria 13

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

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


kar*_*elv 5

我遇到过同样的问题.

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

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

==>不再进行投票了!

笔记:

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