Уменьшить объем памяти с помощью многопроцессорной обработки? - PullRequest
4 голосов
/ 18 ноября 2010

В одном из моих приложений работает около 100 рабочих. Он начинался как threading приложение, но проблемы с производительностью (задержкой) были затронуты. Поэтому я преобразовал этих рабочих в multiprocessing.Process es. Приведенный ниже тест показывает, что снижение нагрузки было достигнуто за счет увеличения использования памяти (коэффициент 6).

Так откуда же конкретно происходит использование памяти, если Linux использует корову, а работники не делятся данными?

Как я могу уменьшить объем памяти? (Альтернативный вопрос: как я могу уменьшить нагрузку на threading?)

Тесты в Linux 2.6.26, 4 CPU 2G RAM: (Обратите внимание, что загрузка процессора указана в% от одного процессора, поэтому полная загрузка составляет 400%. Числа получены из просмотра графиков Мунина.)

                  | threading | multiprocessing
------------------+-----------+----------------
memory usage      | ~0.25GB   | ~1.5GB
context switches  | ~1.5e4/s  | ~5e2/s
system cpu usage  | ~30%      | ~3%
total cpu usage   | ~100%     | ~50%
load avg          | ~1.5      | ~0.7

Справочная информация: приложение обрабатывает события из сети и сохраняет некоторые из них в базе данных MySQL.

1 Ответ

3 голосов
/ 18 ноября 2010

Насколько я понимаю, с динамическими языками, такими как Python, копирование при записи не так эффективно, как намного больше памяти записывается (и, следовательно, копируется) после разветвления. По мере того, как интерпретатор Python проходит через программу, происходит гораздо больше, чем просто ваш код. Например, подсчет ссылок - сам объект будет записан слишком быстро, так как подсчет ссылок должен записывать счетчик ссылок в память (запуск копии).

Имея это в виду, вам, вероятно, потребуется гибридный подход к обработке потоков / обработке. Используйте несколько процессов, чтобы использовать преимущества нескольких ядер и т. Д., Но каждый из них должен запускать несколько потоков (чтобы вы могли иметь дело с нужным вам уровнем параллелизма). Вам просто нужно поэкспериментировать с тем, сколько потоков и процессов вы запускаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...