Как равномерно распределить задачи между узлами с помощью Celery?

Я использую Celery с Django для управления очередью задач и использую один (или несколько) небольших (одноядерных) экземпляров EC2 для обработки задачи.

У меня есть некоторые соображения.

  • Моя задача съедает 100% ЦП на одном ядре. - использует любой доступный процессор, но только в одном ядре
  • Если на одном ядре выполняются 2 задачи, каждая задача будет замедлена вдвое.
  • Я хотел бы начать каждую задачу как можно скорее и не позволять ей стоять в очереди.

Теперь скажем, у меня есть 4 экземпляра EC2, я запускаю сельдерей с "-c 5". то есть 5 одновременных задач на экземпляр.

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

Точно так же, если у меня есть 8 задач, я бы хотел, чтобы каждый экземпляр получал 2 задачи за раз, а не 2 экземпляра, обрабатывающих по 4 задачи каждый.

Сельдерей уже ведет себя так, как я описал? Если нет, то как я могу заставить его вести себя как таковой?


person sajal    schedule 12.12.2011    source источник


Ответы (1)


на самом деле это просто: вы запускаете один экземпляр celery для каждого экземпляра ec2. установите параллелизм на количество ядер на экземпляр ec2.

теперь задачи не мешают и красиво распределяются между вами экземплярами.

(вышеприведенное предполагает, что ваши задачи привязаны к процессору)

person tback    schedule 12.12.2011
comment
добавление: вы ничего не получаете, если задача запускается немедленно, но затем ей приходится конкурировать за ресурсы, что все замедляет. - person tback; 12.12.2011
comment
но что, если у меня есть 4 двухъядерных экземпляра? и я использую параллелизм 2 для каждого работника... даже тогда я хотел бы распределить 4 задачи по 4 отдельным экземплярам, ​​чтобы улучшить ввод-вывод - person sajal; 14.12.2011
comment
Сельдерей не решает эту проблему. Поэтому установите его на 1, если он привязан к вводу-выводу, установите его на 2, если он привязан к процессору. В своем вопросе вы говорите, что одна задача использует 100% ЦП. Использует ли он более 50% ввода-вывода? - person tback; 15.12.2011