Python Multiprocessing: Как я могу уменьшить накладные расходы на процесс? - PullRequest
0 голосов
/ 21 февраля 2012

Я новичок в многопроцессорной обработке - и могу ошибочно истолковать это - но когда я запускаю свои программы, я замечаю, что чем больше процессов я запускаю, тем больше 'sy' идет на моем компьютере с Linux.Например:

Cpu(s): 14.0%us, 24.1%sy,  0.0%ni, 58.8%id,  0.0%wa,  2.2%hi,  0.0%si,  0.8%st

Чем больше процессов я создаю, тем выше идет процесс sy, и фактический процесс просто наполовину выполняется (так что до того, как он достигнет 10% / процессор, было 20% / процессор) иидеальный процессор остается прежним (почти 60%).Я не уверен, что это вопрос Linux или Python, но есть ли что-то, что я могу сделать, чтобы уменьшить это число и позволить моим программам использовать более доступный процессор?

Ответы [ 2 ]

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

Скорее всего, это вопрос аппаратного обеспечения.

Некоторые ключевые вещи:

  • Сколько свободной памяти?
  • Используете ли вы пространство подкачки?
  • Сколько у вас процессоров?
  • Ваше приложение тяжело для вычислений?
  • Насколько велика общая переменная (переменные)?
  • Есть ли в вашем приложении какие-либоВвод / вывод?

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

Могут быть и другие изменения, которые вы можете внести в память Linux, чтобы помочь.Количество открытых файлов может быть один.Я могу проверить, какие настройки процесса вы можете оптимизировать при необходимости.Это немного поможет, но я думаю, что вы, возможно, сталкиваетесь с аппаратной перегородкой.

Другой вариант - настроить диспетчер для порождения на другие серверы, а затем запускать процессы там.Вам нужно будет подключиться к машине по ssh и передать аргумент, если процесс ведущий или ведомый.Это можно сделать, добавив в диспетчер переопределение init для перенаправления процессов.

Надеюсь, это поможет Rich

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

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

Не думайте, что это потерянное время: ядро ​​делает что-то полезноедля вашего процесса.

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

Вы можете использовать strace, чтобы узнать о системных вызовах, выполняемых вашими процессами.

...