2016-04-12 13 views
5

Nie znalazłem dobrej metody monitorowania użycia pamięci skryptu Python przy użyciu multiprocessing. Dokładniej, np zrobić to:Python multiprocessing - Jak monitorować użycie pamięci?

import time 

biglist = range(pow(10, 7)) 
time.sleep(5) 

Wykorzystanie pamięci 1,3 GB, mierzona zarówno /usr/bin/time -v i top. Ale teraz, powiedz mi to zrobić:

import time 
from multiprocessing import Pool 

def worker(x): 
    biglist = range(pow(10, 7)) 
    time.sleep(5) 
    return 

Pool(5).map(worker, range(5)) 

Teraz top raporty 5 x 1,3 GB, co jest poprawne. Ale /usr/bin/time -v nadal zgłasza 1,3 GB, co nie ma sensu. Jeśli mierzy zużycie procesu nadrzędnego, wówczas powinno oznaczać 0. Jeśli mierzy rodzica i dzieci, powinien zgłosić 5 x 1,3 GB. Dlaczego mówi 1,3 GB? Teraz spróbujmy kopiowanie przy zapisie:

import time 
from multiprocessing import Pool 

biglist = range(pow(10, 7)) 

def worker(x): 
    time.sleep(5) 
    return 

Pool(5).map(worker, range(5)) 

teraz /usr/bin/time -v donosi 1,3 GB (ponownie), co jest poprawne. Ale top zgłasza 6 x 1,3 GB, co jest nieprawidłowe. W przypadku kopiowania przy zapisie powinno to wynosić tylko 1,3 GB.

Jak mogę niezawodnie monitorować wykorzystanie pamięci skryptu Python przy użyciu multiprocessing?

Odpowiedz

0

To naprawdę zależy od tego, co rozumie się przez "niezawodny". Możesz użyć polecenia pmap <pid>, aby uzyskać statystyki dotyczące wykorzystania pamięci przez procesy (domyślam się, że jesteś zainteresowany polem total). Musisz śledzić wszystkie procesy, które zostały utworzone podczas wykonywania twojego programu (domyślam się, że tutaj może ci pomóc ps --forest).

Jeśli chcesz uzyskać szczegółowe informacje, możesz użyć opcji /proc/[pid]/{smaps,status,maps} (man pages).

Proszę również pamiętać o różnicy między RSS and VSZ.

Powiązane problemy