Сельдерейская разница между параллелизмом, рабочими и автомасштабированием
В моем /etc/defaults/celeryd
Конфигурационный файл, который я установил:
CELERYD_NODES="agent1 agent2 agent3 agent4 agent5 agent6 agent7 agent8"
CELERYD_OPTS="--autoscale=10,3 --concurrency=5"
Я понимаю, что демон порождает 8 рабочих сельдерея, но я не совсем уверен, что autoscale
а также concurrency
делать вместе. Я думал, что параллелизм - это способ указать максимальное количество потоков, которое может использовать работник, а автоматическое масштабирование - это способ для работника увеличивать и уменьшать количество работающих детей, если это необходимо.
Задачи имеют большую полезную нагрузку (около 20-50 КБ), таких задач примерно 2-3 миллиона, но каждая задача выполняется менее чем за секунду. Я наблюдаю всплеск использования памяти, потому что брокер распределяет задачи для каждого работника, таким образом, реплицируя полезную нагрузку несколько раз.
Я думаю, что проблема в конфиге и что комбинация работники + параллелизм + автомасштабирование является чрезмерной, и я хотел бы получить лучшее понимание того, что делают эти три варианта.
2 ответа
Давайте различать рабочие и рабочие процессы. Вы порождаете сельдерея, это порождает ряд процессов (в зависимости от таких вещей, как --concurrency
а также --autoscale
по умолчанию создается столько процессов, сколько ядер на машине). Нет смысла запускать более одного работника на конкретном компьютере, если вы не хотите выполнять маршрутизацию.
Я бы предложил запускать только 1 работника на машину с числом процессов по умолчанию. Это уменьшит использование памяти за счет устранения дублирования данных между работниками.
Если у вас все еще есть проблемы с памятью, сохраните данные в хранилище и передайте работникам только идентификатор.
При использовании количество процессов устанавливается динамически с максимальными/минимальными значениями, которые позволяют масштабировать рабочий процесс в соответствии с нагрузкой, а при использовании процессов устанавливается статически с фиксированным числом. Поэтому использование этих двух вместе не имеет смысла.
Сельдерей
--autoscale
отвечает за динамическое увеличение и уменьшение пула в зависимости от нагрузки. Это, в свою очередь, добавляет больше процессов, когда есть работа, и удаляет процессы, когда рабочая нагрузка невелика. Так например
--autoscale=10,3
даст вам максимум 10 процессов и минимум 3 процесса.
Что касается сельдерея, то по умолчанию используется многопроцессорность для одновременного выполнения задач. Количество рабочих процессов/потоков можно изменить с помощью
--concurrency
аргумент и по умолчанию равно количеству доступных процессоров, если он не установлен. Так например
--concurrency=5
будет использовать 5 процессов, что означает 5 задач, которые могут выполняться одновременно.