Как отладить код выхода 12 между заданиями в очереди: работа

У нас есть задание MyPrettyJob, которое поставлено в очередь через redis от контроллера. Когда мы запускаем это задание из такой команды, задание действительно выполняется. Когда мы запускаем задание с небольшим количеством данных, очередь остается в сети, но когда мы запускаем задание с большим количеством данных, очередь вылетает с кодом выхода 12, что предполагает ошибку «Недостаточно памяти».

Большая работа обрабатывает около 300 000 элементов, которые в основном зависят друг от друга. С этой целью мы не можем разделить эту работу без серьезного снижения производительности. В некоторых крайних случаях это может занять до нескольких часов вместо нескольких минут, которые требуются сейчас.

Для большого задания очередь выводит следующее:

$ php artisan queue:work --queue=myqueue
Processing: App\Jobs\MyPrettyJob
Processed: App\Jobs\MyPrettyJob
$ echo $?
12

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

Какая очередь выполняет промежуточные задания? Могу ли я каким-либо образом отладить причину нехватки памяти после завершения работы? Может, очередь что-то записывает в журнал или что-то делает в redis между заданиями? Похоже, это действительно странное время для того, чтобы этот процесс вылетел из строя.


person Sumurai8    schedule 12.04.2019    source источник
comment
помещать данные в очередь кусками, чтобы избежать нехватки памяти   -  person Adnan Mumtaz    schedule 12.04.2019
comment
На самом деле мы не можем не иметь огромных (порядка нескольких часов) штрафа на накладные расходы.   -  person Sumurai8    schedule 12.04.2019
comment
@ Sumurai8 Какое действие выполняет задание?   -  person Alex Mayo    schedule 12.04.2019
comment
Он обрабатывает около 300 000 элементов, которые необходимо поместить в базу данных после просмотра набора данных. Поскольку большинство элементов зависят от других элементов, наиболее эффективный способ сделать это - хранить все данные в памяти. Поскольку 300 000 обновлений требуют времени, мы откладываем любое взаимодействие с базой данных до самого конца этой работы. Очередь аварийно завершает работу независимо от того, выполняем ли мы взаимодействие с базой данных, но в любом случае задание выполняется успешно. Я считаю, что это означает, что метод обработки задания подошел к концу.   -  person Sumurai8    schedule 12.04.2019
comment
Очередь также аварийно завершает работу независимо от того, стоит ли после нее что-нибудь еще. Я считаю, что это означает, что это во время очистки этой работы.   -  person Sumurai8    schedule 12.04.2019
comment
Я прошел через что-то подобное. Вы должны распределить их по нескольким процессам, чтобы сэкономить время. Разделите данные до минимума и разделите свои причудливые объекты на голые массивы данных. И вы должны сделать так, чтобы 300000 элементов не зависели друг от друга так сильно, что вы должны смотреть на свой код и методы обработки данных, а не на память и механизм очередей. Я могу достичь предела памяти и тайм-аута в любой день, но тогда я могу написать код, чтобы жить в моих пределах.   -  person f_i    schedule 13.04.2019
comment
@Faiz Я не ищу совета, как улучшить мою работу в очереди. В настоящее время задание очереди должно выполняться за O (N) за счет увеличения использования памяти. Он уже использует только массивы, и потребление памяти заданием, хотя и велико, не является нелепым. Мы можем запустить несколько заданий из этих наихудших сценариев одновременно без сбоя сервера. Я специально спросил , что очередь выполняет промежуточные задания, потому что она потребляет БОЛЬШЕ памяти после завершения моей работы, а ресурсы должны быть освобождены и, следовательно, должны потреблять МЕНЬШЕ память. Я не знаю, как отлаживать то, что там происходит.   -  person Sumurai8    schedule 13.04.2019


Ответы (1)


Код выхода 12 возникает, когда система обработчика очереди определяет, что она использовала больше памяти, чем разрешено (см. https://github.com/laravel/framework/blob/5.8/src/Illuminate/Queue/Worker.php#L199-L210 для конкретного раздела кода). Если вы запустите php artisan queue:work --memory=<digit>, где памяти достаточно для полного выполнения вашего задания (например, 1024 для 1 ГБ), вы сможете позволить своей работе завершиться и продолжить выполнение после этого.

person Glen Solsberry    schedule 07.05.2019