Подтвердить что ты не робот

Laravel Artisan Queues - высокая производительность процессора

Я установил очереди в Laravel для своих скриптов обработки. Я использую beanstalkd и supervisord. Существует 6 разных труб для различных видов обработки.

Проблема в том, что для каждой трубки ремесленник постоянно порождает рабочих каждую секунду. Рабочий код, кажется, спят в течение 1 секунды, а затем рабочая нить использует 7-15% CPU, умножьте это на 6 трубок... и я хотел бы иметь нескольких рабочих на трубу.. мой процессор будет съеден.

Я попытался изменить 1-секундный сон на 10 секунд. Это помогает, но по-прежнему существует огромный скачок CPU каждые 10 секунд, когда рабочие снова встают. В настоящее время я даже ничего не обрабатываю, потому что очереди полностью пусты, а просто рабочие ищут что-то делать.

Я также тестировал, чтобы увидеть использование процессора larvel, когда я обновил страницу в браузере, и это зависело от 10%. Я сейчас нахожусь в узле с ограниченным доступом, чтобы объяснить это, но все же... кажется, что рабочие разворачивают экземпляр laravel каждый раз, когда они просыпаются.

Нет ли способа решить это? Должен ли я просто вкладывать большие деньги в более дорогой сервер, чтобы иметь возможность слушать, готова ли работа?

EDIT:

Найденное решение... он НЕ должен был использовать очередь мастеров: слушатель или очередь: работа Я заглянул в код очереди и, похоже, не существует способа обойти эту проблему, она требует, чтобы laravel загружался каждый раз, когда работник проверяет, что нужно делать больше.

Вместо этого я написал своего собственного слушателя, используя pheanstalk. Я все еще использую laravel для ввода вещей в очередь, затем мой пользовательский прослушиватель анализирует данные очереди, а затем запускает команду artisan для запуска.

Теперь мое использование процессора для моих слушателей меньше% 0, единственный раз, когда мой процессор начинает стрелять, это когда он на самом деле находит работу, а затем запускает команду, я в порядке с этим.

4b9b3361

Ответ 1

Проблема с высоким процессором вызвана тем, что рабочий загружает полную структуру каждый раз, когда проверяет задание в очереди. В laravel 4.2 вы можете использовать php artisan queue:work --daemon. Это будет загружать фреймворк один раз, и проверка/обработка заданий происходит внутри цикла while, что позволяет CPU дышать легко. Более подробную информацию о работнике демона вы можете найти в официальной документации: http://laravel.com/docs/queues#daemon-queue-worker.

Однако это преимущество сопряжено с недостатком - вам нужно проявлять особую осторожность при развертывании кода, и вы должны заботиться о соединениях с базой данных. Как правило, отключены длительные соединения с базой данных.

Ответ 2

У меня была такая же проблема.

Но я нашел другое решение. Я использовал ремесленника как есть, но я изменил время "часов". По умолчанию (из laravel) это время жестко запрограммировано на ноль, я изменил это значение на 600 (секунд). См. Файл:   'Поставщик/Laravel/рамки/SRC/Осветите/Queue/BeanstalkdQueue.php' и в функции   'public function pop ($ queue = null)'

Итак, теперь работа также слушает очередь в течение 10 минут. Когда у него нет работы, он завершает работу, а диспетчер перезапускает его. Когда он получает задание, он выполняет его после того, как он существует, и диспетчер перезапускает его.

== > Нет опроса больше!

Примечания:

  • он не работает для очереди iron.io или других.
  • он может не работать, если вы хотите, чтобы 1 рабочий принимал задания из более чем 1 очереди.

Ответ 3

В соответствии с этим commit теперь вы можете установить новую опцию queue:listen "--sleep={int}", которая позволит вам точно настроить время подождать до опроса новых рабочих мест.
Кроме того, по умолчанию установлено значение 3 вместо 1.