2010-09-30 17 views
8


Zajmuję się tworzeniem aplikacji w Pythonie na Ubuntu i używam zewnętrznych plików binarnych z poziomu Pythona przy użyciu podprocesu. Ponieważ te pliki binarne są generowane w czasie wykonywania i mogą być nieuczciwe, potrzebuję ścisłej kontroli ilości pamięci i czasu działania tych plików binarnych. Czy w jakiś sposób mogę ograniczyć lub monitorować wykorzystanie pamięci przez te programy binarne w czasie wykonywania? Naprawdę nie chciałbym używać czegoś takiego jak "ps" w podprocesie do tego celu.Sprawdź użycie pamięci podprocesu w Pythonie

Odpowiedz

4

Posiadanie numeru PID swojego podproces można przeczytać wszystkie informacje z proc file-system. Zastosowanie:

/Proc/[PID]/smaps (od Linux 2.6.14) Plik ten pokazuje zużycia pamięci każdego z mapowania procesu. Dla każdego z przekształceń istnieje szereg linii następująco:

lub

/Proc/[PID]/statm zawiera informacje o wykorzystaniu pamięci, mierzona na stronach.

Alternatywnie można ograniczyć środki, które można nabyć z podproces:

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

Kiedy dany limit pamięci wirtualnej jest osiągnięty proces nie powiedzie się z pamięci.

+1

muszę wdrożyć to z poziomu Pythona. Tak więc musiałbym rozwidlić proces potomny, a jednocześnie uruchomić pętlę while, która utrzymuje monitorowanie/proc/(pid)/smaps plik. Czy nie jest jakiś inny sposób, np .: mogę przydzielić pamięć stałą dla podprocesu podrzędnego? Miałem nadzieję jakoś wykorzystać menedżera pamięci Pythona. – Neo

+0

Dang, nigdy o tym nie myślałem. Tak, to powinno działać dobrze dla mnie. – Neo

+2

ulimit jest przestarzały. Fragment strony podręcznika: "Ostrzeżenie: ta procedura jest przestarzała, zamiast tego użyj getrlimit (2), setrlimit (2) i sysconf (3)." – omikron

10

można wykorzystywać moduł Pythona resource ustawić limity przed tarłem swoją podproces.

Do monitoringu, resource.getrusage() da Ci zestawione informacji przez wszystkich podprocesów; jeśli chcesz zobaczyć informacje o poszczególnych podprocesach, możesz zrobić sztuczkę/proc w tym innym komentarzu (nieprzenośny, ale skuteczny), lub ustawić warstwę programu Python pomiędzy każdym podprocesem i dowiedzieć się jakiejś komunikacji (przenośnej, brzydkiej, delikatnie działającej).

+0

dzięki Habbie, to dokładnie to, czego potrzebowałem. – Neo