Оптимизация памяти и потребления ЦП вашими воркерами очередей в Laravel
Со временем, при обработке ваших заданий Laravel, в памяти сервера будут накапливаться некоторые ссылки, которые не будут обнаружены сборщиком мусора PHP и в какой-то момент вызовут сбой сервера.
Однако решение простое; чаще перезапускайте воркеры.
php artisan queue:work --max-jobs=1000 --max-time=3600
Вы можете использовать параметры --max-jobs и --max-time в команде php artisan queue:work, чтобы ограничить количество заданий, которые может обрабатывать рабочий процесс, или время, в течение которого он должен оставаться в рабочем состоянии. Как только предел будет достигнут, рабочий процесс завершится, и ваш диспетчер процессов запустит новый экземпляр.
Если вы знаете, что есть определенная задача, которая может потребовать много памяти, и вы хотите, чтобы рабочий процесс перезапустился после завершения такой задачи, вы можете добавить этот код в конец метода handle():
public function handle()
{
app('queue.worker')->shouldQuit = 1;
}
Потребление памяти очередью
Если ваш сервер имеет 2 ядра ЦП, он может выполнять только 2 задачи параллельно. Это не означает, что вы можете запускать на этом сервере только 2 воркера. Когда количество процессов превышает количество ядер, срабатывает расширенный механизм переключения контекста, который позволяет нескольким процессам совместно использовать ресурсы ЦП. Другими словами, ОС будет переключаться между несколькими задачами и позволять им использовать доступные ядра ЦП, это переключение выполняется очень быстро и незаметно для человека.
Теперь, когда мы знаем, как ОС распределяет доступные ресурсы ЦП, мы понимаем важность определения приоритетов процессов. Если на вашем сервере запущено несколько рабочих процессов, и в то же время они обслуживают HTTP-запросы, вы можете захотеть дать рабочим процессам меньший приоритет, чтобы ОС выделяла больше пропускной способности ЦП процессам, которые обслуживают HTTP-запросы.
Вы можете сделать это, запустив рабочий процесс с высоким значением nice:
nice -n 10 php artisan queue:work
Высокое значение nice означает низкий приоритет. ОС позволит этому рабочему процессу немного подождать, поскольку он дает больше пропускной способности другим важным процессам, таким как php-fpm или nginx.
Допустимые значения от 0 до 19.
Еще одна вещь, которую вы можете сделать, это убедиться, что воркер простаивает между заданиями, и если очередь пустая:
php artisan queue:work --rest=0.5 --sleep=5
Этот процесс воркера будет ждать полсекунды между заданиями и ждать 5 секунд, если обнаружит, что очередь пуста. Простаивающие рабочие процессы дают ОС возможность выделить больше ресурсов ЦП для других процессов.