Как отладить код выхода 12 между заданиями в очереди: работа - PullRequest
1 голос
/ 12 апреля 2019

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

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

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

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

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

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

1 Ответ

1 голос
/ 07 мая 2019

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

...