В многопроцессорной обработке 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.
Мое понимание --concurrency=30
варианта в сельдерея является то, что он указывает сельдерей, сколько ядер он будет использовать, а не сколько процессов требуется нерест. Я прав? Есть ли способ дать указание Сельдерей использовать 2 ядра, а для каждого основного процесса - 15 процессов, что дает мне 30 одновременных процессов, чтобы моя загрузка сервера оставалась низкой?
То, что я не понимаю, - это то, почему среднее значение нагрузки, использующее многопроцессорность python, намного ниже, чем сельдерей. Является ли сельдерей, использующим все ядра, или просто создает дополнительные процессы в одном ядре, что, по моему мнению, является тем, что делает многопроцессорность python, поскольку я едва могу заметить какую-либо нагрузку на сервер. Но с сельдереем все зависает, когда средняя загрузка превышает ядра на сервере. – lukik
Я добавил дополнительную информацию по вопросу, иллюстрирующему проблему загрузки сервера, стоящую перед вами. Проблема, которую я имею, заключается в том, что параметр '--concurrency' указывает количество используемых ядер, а не количество процессов, которые необходимо создать или что я ошибаюсь? Причина в настройке --concurrency = 30, я вижу, что средняя нагрузка нагрузка выше 20, а затем зависает около 25, и машина зависает на мне .... – lukik
@lukik средняя разница в загрузке огромна, и я ничего не могу сказать о нем, можете ли вы предоставить более подробную информацию о задаче сельдерея, которую вы выполняете? вы проверяли процентное соотношение CPU с процессами сельдерея с помощью 'top'? и являются ли брокером и конечным бэкэндом, установленным на одной машине? и вернемся к вашему вопросу о параллелизме, это количество рабочих процессов в пуле, попробуйте запустить 3 рабочих каждый с параллелизмом 10, 'celery multi start 3 -c 10 -A your_app'. – Pierre