2014-04-29 20 views
17

Sto lavorando a un qualche tipo di servizio di sistema (in realtà è solo un parser di log) scritto in Python. Questo programma dovrebbe funzionare continuamente per un lungo periodo (si spera intendo giorni e settimane senza guasti e necessità di riavvio). Ecco perché sono preoccupato per il consumo di memoria.Consumo di memoria Python su Linux: la memoria fisica e virtuale crescono mentre la dimensione dell'heap rimane la stessa

ho messo le informazioni insieme di diverso utilizzo della memoria processo da diversi siti in una semplice funzione:

#!/usr/bin/env python 
from pprint import pprint 
from guppy import hpy 
from datetime import datetime 
import sys 
import os 
import resource 
import re 

def debug_memory_leak(): 
    #Getting virtual memory size 
    pid = os.getpid() 
    with open(os.path.join("/proc", str(pid), "status")) as f: 
     lines = f.readlines() 
    _vmsize = [l for l in lines if l.startswith("VmSize")][0] 
    vmsize = int(_vmsize.split()[1]) 

    #Getting physical memory size 
    pmsize = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 

    #Analyzing the dynamical memory segment - total number of objects in memory and heap size 
    h = hpy().heap() 
    if __debug__: 
     print str(h) 
    m = re.match(
     "Partition of a set of ([0-9]+) objects. Total size = ([0-9]+) bytes(.*)", str(h)) 
    objects = m.group(1) 
    heap = int(m.group(2))/1024 #to Kb 

    current_time = datetime.now().strftime("%H:%M:%S") 
    data = (current_time, objects, heap, pmsize, vmsize) 
    print("\t".join([str(d) for d in data])) 

Questa funzione è stata utilizzata per studiare le dinamiche del consumo di memoria del mio processo long-playing, e io ancora non riesco a spiegare il suo comportamento. È possibile notare che le dimensioni dell'heap e la quantità totale degli oggetti non sono state modificate mentre la memoria fisica e virtuale è aumentata dell'11% e dell'1% durante questi venti minuti.

UPD: Il processo ha funzionato per quasi 15 ore da questo momento. L'heap è sempre lo stesso, ma la memoria fisica è aumentata di sei volte e la memoria virtuale è aumentata del 50%. La curva è sembra essere lineare eccetto gli strani valori anomali alle 3:00 AM:

Tempo Obj Mucchio PHM VM

19:04:19 31424 3928 5460 143732

19:04:29 30582 3704 10276 158240

19:04:39 30582 3704 10372 157772

19:04:50 30582 3709 10372 157772

19:05:00 30582 3704 10372 157772

(...)

19:25:00 30583 3704 11524 159900

09:53:23 30581 3704 62380 210756

Mi chiedo che cosa sta succedendo con lo spazio degli indirizzi del mio processo. La dimensione costante dell'heap suggerisce che tutti gli oggetti dinamici siano deallocati correttamente. Ma non ho dubbi che il crescente consumo di memoria influenzerà la sostenibilità di questo processo cruciale per la vita nel lungo periodo.

enter image description here

Qualcuno potrebbe chiarire la questione per favore? Grazie.

(io uso RHEL 6.4, kernel 2.6.32-358 con Python 2.6.6)

+4

Come funziona l'aspetto grafico quando si esegue per diverse ore invece di 20 minuti – 2rs2ts

+0

Oh, possibilmente correlati:?. http://stackoverflow.com/q/1194416/691859 – 2rs2ts

+0

@ 2rs2ts, grazie per la tua risposta mi aggiornerò il grafico domani quando verrò al lavoro :) –

risposta

5

Senza sapere che cosa il vostro programma sta facendo, questo potrebbe aiutare.

mi sono imbattuto in questo articolo quando si lavora su un progetto un po 'indietro: http://chase-seibert.github.io/blog/2013/08/03/diagnosing-memory-leaks-python.html che dice: "Lungo l'esecuzione di lavori di Python che consumano un sacco di memoria durante l'esecuzione non può restituire che la memoria al sistema operativo fino a quando il processo di realtà termina, anche se tutto è garbage collection correttamente."

ho finito per usare il modulo multiprocessing per avere il mio progetto fork un processo separato e tornare quando aveva bisogno di fare il lavoro, e non ho notato alcun problemi di memoria da allora.

Che o provare in Python 3.3 http://bugs.python.org/issue11849

+0

Sfortunatamente, la libreria che sto usando (auparse - va con auditd in Linux) non è ancora stata trasferita al 3 ° ramo. –

+0

@ user3588162: Ha funzionato per me. Grazie mille. – Prateek

Problemi correlati