Есть ли какие-то рекомендации, которым нужно следовать при выборе количества процессов с многопроцессорностью? - PullRequest
11 голосов
/ 20 февраля 2012

Я просто мокну от многопроцессорности (и это совершенно потрясающе!), Но мне было интересно, есть ли какие-нибудь рекомендации по выбору количества процессов? Это только на основе количества ядер на сервере? Это как-то основано на приложении, которое вы запускаете (количество циклов, сколько процессоров он использует и т. Д.)? и т.д ... как я могу решить, сколько процессов порождать? Прямо сейчас я просто угадываю и добавляю / удаляю процессы, но было бы замечательно, если бы было какое-то руководство или лучшая практика.

Еще один вопрос, я знаю, что произойдет, если я добавлю слишком мало (программа отложена), но что, если я добавлю «слишком много»?

Спасибо!

Ответы [ 2 ]

12 голосов
/ 20 февраля 2012

Если все ваши потоки / процессы действительно связаны с процессором, вы должны запустить столько процессов, сколько процессор сообщает ядрам. Благодаря HyperThreading каждое физическое ядро ​​ЦП может иметь возможность представлять несколько виртуальных ядер. Звоните multiprocessing.cpu_count, чтобы узнать количество виртуальных ядер.

Если только p из 1 ваших потоков привязано к процессору, вы можете отрегулировать это число, умножив на p . Например, если половина ваших процессов привязана к процессору ( p = 0,5) и у вас есть два процессора с 4 ядрами в каждом и 2x HyperThreading, вы должны запустить 0,5 * 2 * 4 * 2 = 8 процессов.

Если у вас слишком мало процессов, ваше приложение будет работать медленнее, чем ожидалось. Если ваше приложение отлично масштабируется и привязано только к процессору (т. Е. В 10 раз быстрее, когда выполняется в 10 раз больше ядер), это означает, что скорость у вас ниже. Например, если ваша система требует 8 процессов, но вы запускаете только 4, вы будете использовать только половину вычислительной мощности и займет вдвое больше времени. Обратите внимание, что на практике ни одно приложение не масштабируется идеально, но некоторые (трассировка лучей, кодирование видео) довольно близки.

Если у вас слишком много процессов, накладные расходы на синхронизацию возрастут. Если ваша программа имеет минимальные или нулевые накладные расходы на синхронизацию, это не повлияет на общее время выполнения, но может привести к тому, что другие программы будут выглядеть медленнее, чем они, если вы не установите свои процессы с более низким приоритетом. Избыточное количество процессов (скажем, 10000) в теории хорошо, если у вашей ОС хороший планировщик. На практике практически любая синхронизация сделает накладные расходы невыносимыми.

Если вы не уверены, привязано ли ваше приложение к процессору и / или идеально масштабируется, просто наблюдайте за нагрузкой на систему с различным числом потоков. Требуется, чтобы загрузка системы была чуть ниже 100%, или, если точнее, uptime - это количество виртуальных ядер.

2 голосов
/ 20 февраля 2012

Это определенно основано на том, что делает приложение.Если он сильно загружен ЦП, количество ядер является разумной отправной точкой.Если нагрузка IO, многократные процессы не будут способствовать производительности в любом случае.Если это в основном ЦП со случайным вводом-выводом (например, оптимизация PNG), вы можете запустить на несколько процессов больше, чем количество ядер.

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

...