2016-04-12 19 views
5

Non ho trovato un buon modo per monitorare l'utilizzo della memoria di uno script Python utilizzando multiprocessing. Più specificamente, dire fare questo:Multiprocessing di Python - Come monitorare l'utilizzo della memoria?

import time 

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

L'utilizzo della memoria è di 1,3 GB, determinata sia /usr/bin/time -v e top. Ma ora, dico faccio questo:

import time 
from multiprocessing import Pool 

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

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

Ora top report 5 x 1,3 GB, che è corretto. Ma /usr/bin/time -v riporta ancora 1,3 GB, il che non ha senso. Se misura il consumo del processo genitore, allora dovrebbe dire 0. Se sta misurando il genitore ei figli, dovrebbe riportare 5 x 1,3 GB. Perché dice 1,3 GB? Ora proviamo copy-on-write:

import time 
from multiprocessing import Pool 

biglist = range(pow(10, 7)) 

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

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

Ora /usr/bin/time -v riporta 1,3 GB (di nuovo), che è corretto. Ma i report top 6 x 1,3 GB, che non è corretto. Con copy-on-write, dovrebbe riportare solo 1,3 GB.

Come posso monitorare in modo affidabile l'utilizzo della memoria di uno script Python utilizzando multiprocessing?

risposta

0

Dipende davvero da cosa si intende per "affidabile". È possibile che si desideri utilizzare il comando pmap <pid> per ottenere statistiche sull'utilizzo della memoria dei processi (suppongo che sia interessato al campo total). Devi tenere traccia di tutti i processi che sono stati creati durante l'esecuzione del tuo programma (immagino che ps --forest possa aiutarti).

Se si desidera ottenere dettagli, è possibile utilizzare /proc/[pid]/{smaps,status,maps} (man pages).

Ricordare inoltre la differenza tra RSS and VSZ.

Problemi correlati