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.
Qualcuno potrebbe chiarire la questione per favore? Grazie.
(io uso RHEL 6.4, kernel 2.6.32-358 con Python 2.6.6)
Come funziona l'aspetto grafico quando si esegue per diverse ore invece di 20 minuti – 2rs2ts
Oh, possibilmente correlati:?. http://stackoverflow.com/q/1194416/691859 – 2rs2ts
@ 2rs2ts, grazie per la tua risposta mi aggiornerò il grafico domani quando verrò al lavoro :) –