2010-09-30 4 views
8


Я разрабатываю приложение в Python на Ubuntu, и я запускаю внешние двоичные файлы изнутри python с использованием подпроцесса. Поскольку эти двоичные файлы генерируются во время выполнения и могут быть изгоями, мне нужно сохранить строгую вкладку относительно объема памяти и времени выполнения этих двоичных файлов. Есть ли способ ограничить или контролировать использование памяти этих двоичных программ во время выполнения? Я бы очень ненавидел использовать для этого в подпроцессе что-то вроде ps.Проверьте использование памяти подпроцесса в Python

ответ

4

Имея номер PID вашего подпроцесса, вы можете прочитать всю информацию от proc file-system. Использование:

/Proc/[PID]/smaps (с Linux 2.6.14) Этот файл показывает объем памяти для каждого из отображений процесса. Для каждого из отображений существует ряд линий следующим образом:

или

/Proc/[PID]/statm Содержит информацию об использовании памяти, измеряется в страницах.

В качестве альтернативы вы можете ограничить ресурсы, которые подпроцесс может aquire с:

subprocess.Popen('ulimit -v 1024; ls', shell=True) 

Когда данный предел виртуальной памяти достигается процесс терпит неудачу с из памяти.

+1

Мне нужно реализовать это изнутри Python. Поэтому мне нужно было бы развить дочерний процесс и одновременно запустить цикл while, который сохраняет файл мониторинга/proc/(pid)/smaps. Нет другого пути, например: я могу выделить фиксированную память для дочернего подпроцесса? Я надеялся каким-то образом использовать диспетчер памяти python. – Neo

+0

Данг, никогда не думал об этом. Да, это должно работать отлично для меня. – Neo

+2

ulimit устарел. Excerpt from man page: «Warning: эта процедура устарела. Вместо этого используйте getrlimit (2), setrlimit (2) и sysconf (3)». – omikron

10

Вы можете использовать модуль resource Python, чтобы установить лимиты перед тем, как развернуть свой подпроцесс.

Для мониторинга resource.getrusage() предоставит вам сводную информацию по всем вашим подпроцессам; если вы хотите просмотреть информацию о каждом подпроцессе, вы можете сделать трюк/proc в этом другом комментарии (не переносимый, но эффективный) или сложить программу Python между каждым подпроцессом и выяснить, какое сообщение (переносное, уродливое, умеренно эффективное).

+0

благодарит Хабби, это именно то, что мне нужно. – Neo

Смежные вопросы