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, единственный раз, когда мой процессор начинает стрелять, это когда он на самом деле находит работу, а затем запускает команду, я в порядке с этим.
Ответы
Ответ 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.