Определение соответствующего количества процессов - PullRequest
2 голосов
/ 21 июля 2011

У меня есть код на Python, который обрабатывает множество логов apache (распаковка, анализ, перебор чисел, регулярное выражение и т. Д.).Один родительский процесс, который принимает список файлов (до нескольких миллионов) и отправляет список файлов для анализа рабочим, используя многопроцессорный пул.

Интересно, есть ли какие-нибудь рекомендации / ориентиры / советы, которые могут помочь мне оценить идеальное количество дочерних процессов? Т.е.лучше иметь один процесс на ядро, чем запускать несколько сотен?

В настоящее время 3/4 времени выполнения скрипта читает файлы и распаковывает их, а с точки зрения ресурсов, его ЦП, который загружен на 100%, память и ввод / вывод в порядке.Поэтому я предполагаю, что многое можно сделать с правильными настройками многопроцессорности.Скрипт будет работать на разных компьютерах / ОС, поэтому приветствуются также специальные советы для ОС.

Кроме того, есть ли преимущество в использовании потоков, а не многопроцессорных?

Ответы [ 4 ]

1 голос
/ 21 июля 2011

Интересно, есть ли какие-нибудь рекомендации / ориентиры / советы, которые могут помочь мне оценить идеальное количество дочерних процессов?

Нет.

Наличие одного процесса на ядро ​​лучше, чем запуск нескольких сотен из них?

Вы никогда не узнаете заранее .

Слишком много степеней свободы.

Эмпирически можно обнаружить его, выполнив эксперименты, пока вы не достигнете желаемого уровня производительности.

Кроме того, есть ли какое-то преимущество в использовании потоков, а не многопроцессорности?

Редко.

Темы мало помогают.Несколько потоков, выполняющих ввод / вывод, будут заблокированы, ожидая, пока процесс (в целом) ожидает, пока O / S завершит запрос ввода / вывода.

Ваша операционная система выполняет очень, очень хорошую работупланирование процессов.Когда у вас интенсивные операции ввода-вывода, вам действительно нужно несколько процессов.

1 голос
/ 21 июля 2011

Несколько ядер не обеспечивают лучшую производительность, если программа связана с вводом / выводом. Производительность может даже ухудшиться, если диск обслуживает два или более мастеров.

0 голосов
/ 21 июля 2011

Я не уверен, что нынешние ОС делают это, но раньше было так, что буферы ввода / вывода были выделены для каждого процесса, поэтому разделение буфера одного процесса между несколькими потоками привело бы к перегрузке буфера. Вам гораздо лучше использовать несколько процессов для задач, связанных с вводом / выводом.

0 голосов
/ 21 июля 2011

Сначала я отвечу на последний вопрос.В CPython практически невозможно добиться значительного прироста производительности путем распределения нагрузки, связанной с процессором, между потоками.Это связано с глобальной блокировкой интерпретатора .В этом отношении multiprocessing - лучшая ставка.

Что касается оценки идеального числа работников, вот мой совет: проведите несколько экспериментов с вашим кодом, вашими данными, вашим оборудованием иразличное количество работников, и посмотрите, что вы можете извлечь из этого с точки зрения ускорений, узких мест и т. д.

...