2016-04-12 5 views
5

Ich habe keine gute Möglichkeit gefunden, die Speichernutzung eines Python-Skripts mit multiprocessing zu überwachen. Genauer gesagt, sage ich dies tun:Python Multiprocessing - Wie überwacht man die Speichernutzung?

import time 

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

Der Speicherverbrauch 1,3 GB ist, wie durch Messung /usr/bin/time -v und top. Aber jetzt, sage ich dies tun:

import time 
from multiprocessing import Pool 

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

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

Jetzt top Berichte 5 x 1,3 GB, was richtig ist. Aber /usr/bin/time -v meldet immer noch 1,3 GB, was keinen Sinn ergibt. Wenn es den Verbrauch des Elternprozesses misst, sollte es 0 ergeben. Wenn es den Elternteil und die Kinder misst, sollte es 5 x 1,3 GB melden. Warum heißt es 1,3 GB? Lassen Sie uns copy-on-write Jetzt versuchen:

import time 
from multiprocessing import Pool 

biglist = range(pow(10, 7)) 

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

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

Jetzt /usr/bin/time -v meldet 1,3 GB (wieder), was richtig ist. Aber top meldet 6 x 1,3 GB, was falsch ist. Mit Copy-on-Write sollte es nur 1,3 GB melden.

Wie kann ich die Speicherauslastung eines Python-Skripts mithilfe von multiprocessing zuverlässig überwachen?

Antwort

0

Es hängt wirklich davon ab, was mit "zuverlässig" gemeint ist. Sie können den Befehl pmap <pid> verwenden, um Statistiken über die Speichernutzung der Prozesse zu erhalten (ich nehme an, Sie interessieren sich für das Feld total). Sie müssen alle Prozesse verfolgen, die während der Ausführung Ihres Programms erstellt wurden (ich denke ps --forest kann Ihnen hier helfen).

Wenn Sie Details erhalten möchten, können Sie /proc/[pid]/{smaps,status,maps} (man pages) verwenden. Bitte beachten Sie auch den Unterschied zwischen RSS and VSZ.