2014-11-22 2 views
1

В многопроцессорной обработке python я могу создать многопроцессорный пул из 30 процессов для обработки некоторого длинного уравнения на некоторых идентификаторах. Следующий код порождает 30 процессов на 8-ядерном компьютере, а load_average никогда не превышает 2.0. Фактически, 30 потребителей - это предел, учитывая, что сервер, на котором база данных postgresql, на которой размещены ID, имеет 32 ядра, поэтому я знаю, что могу создавать больше процессов, если бы моя база данных могла ее обрабатывать.Как реализовать многопроцессорный пул с использованием Celery

from multiprocessing import Pool 
number_of_consumers = 30 
pool = Pool(number_of_consumers) 

Я нашел время, чтобы настроить сельдерей, но не смог воссоздать 30 процессов. Я думал установить параллелизм, например. -c 30 создаст 30 процессов, но если не ошибаюсь, значит, у меня 32 процессора, которые я намереваюсь использовать, потому что у меня только 8! Кроме того, я вижу в load_average ударе 10.0 на машине сердечника 8, которая плохо ..

[program:my_app] 
command = /opt/apps/venv/my_app/bin/celery -A celery_conf.celeryapp worker -Q app_queue -n app_worker --concurrency=30 -l info 

Таким образом, при использовании сельдерея, как я могу восстановить мои 30 процессов на 8 основных машины?

Edit: Отборочные Путаница

Я думал, что я прикрепить изображение, чтобы проиллюстрировать мою растерянность от нагрузки на сервер при обсуждении сельдерей и Python Multiprocessing. Используемый сервер имеет 8 ядер. Используя Python Multiprocessing и нерестуя 30 процессов, среднее значение нагрузки, как показано на прилагаемой диаграмме, составляет 0,22, что означает . Если мои знания в Linux дают мне право -, то мой сценарий использует одно ядро, чтобы порождать 30 процессов, следовательно, очень низкое значение load_average.

load_average using python multiprocessing screenshot

Мое понимание --concurrency=30 варианта в сельдерея является то, что он указывает сельдерей, сколько ядер он будет использовать, а не сколько процессов требуется нерест. Я прав? Есть ли способ дать указание Сельдерей использовать 2 ядра, а для каждого основного процесса - 15 процессов, что дает мне 30 одновременных процессов, чтобы моя загрузка сервера оставалась низкой?

ответ

0

сельдерей работник состоит из:

  1. потребителя сообщения
  2. Worker Бассейна

Потребитель сообщения получает задачи от брокера и отправляет их на рабочий в бассейне.

--concurrency или -c аргумента определяет процессы числа в этом пуле, так что если вы используете prefork пул, который по умолчанию, то у вас уже есть 30 процессов в бассейне с помощью --concurrency=30, вы можете проверить, посмотрев на рабочем выход, когда он начинает, он должен иметь что-то вроде:

concurrency: 30 (prefork) 

записку от docs on concurrency:

Количество процессов (многопроцессорной/PreFork бассейн)

Другие процессы в пулах, как правило, лучше, но есть точка отсечения, когда добавление большего количества процессов пула влияет на производительность отрицательными способами.Есть даже некоторые доказательства, подтверждающие, что наличие нескольких рабочих экземпляров работает, может работать лучше, чем наличие одного рабочего. Например, 3 работника, каждый из которых имеет 10 пулов. Вам нужно поэкспериментировать, чтобы найти номера, которые лучше всего подходят для вас, поскольку это зависит от приложения, рабочей нагрузки, времени выполнения задачи и других факторов.

Если вы хотите запустить несколько экземпляров рабочих, вы должны смотреть на celery multi или запустить их вручную с помощью celery worker.

+0

То, что я не понимаю, - это то, почему среднее значение нагрузки, использующее многопроцессорность python, намного ниже, чем сельдерей. Является ли сельдерей, использующим все ядра, или просто создает дополнительные процессы в одном ядре, что, по моему мнению, является тем, что делает многопроцессорность python, поскольку я едва могу заметить какую-либо нагрузку на сервер. Но с сельдереем все зависает, когда средняя загрузка превышает ядра на сервере. – lukik

+0

Я добавил дополнительную информацию по вопросу, иллюстрирующему проблему загрузки сервера, стоящую перед вами. Проблема, которую я имею, заключается в том, что параметр '--concurrency' указывает количество используемых ядер, а не количество процессов, которые необходимо создать или что я ошибаюсь? Причина в настройке --concurrency = 30, я вижу, что средняя нагрузка нагрузка выше 20, а затем зависает около 25, и машина зависает на мне .... – lukik

+0

@lukik средняя разница в загрузке огромна, и я ничего не могу сказать о нем, можете ли вы предоставить более подробную информацию о задаче сельдерея, которую вы выполняете? вы проверяли процентное соотношение CPU с процессами сельдерея с помощью 'top'? и являются ли брокером и конечным бэкэндом, установленным на одной машине? и вернемся к вашему вопросу о параллелизме, это количество рабочих процессов в пуле, попробуйте запустить 3 рабочих каждый с параллелизмом 10, 'celery multi start 3 -c 10 -A your_app'. – Pierre

Смежные вопросы