psutil - Consumo de memoria de Python en Linux: la memoria física y virtual están creciendo, mientras que el tamaño del montón sigue siendo el mismo
python memory profiler (1)
Sin saber lo que está haciendo su programa, esto podría ayudar.
Me encontré con este artículo cuando trabajaba en un proyecto hace un tiempo: http://chase-seibert.github.io/blog/2013/08/03/diagnosing-memory-leaks-python.html que dice, "Long running Python "los trabajos que consumen mucha memoria mientras se ejecutan pueden no devolver esa memoria al sistema operativo hasta que el proceso realmente termine, incluso si todo es basura recolectada correctamente".
Terminé usando el módulo de multiprocesamiento para que mi proyecto bifurque un proceso por separado y vuelva cuando sea necesario, y no he notado ningún problema de memoria desde entonces.
Eso o probarlo en Python 3.3 http://bugs.python.org/issue11849
Estoy trabajando en algún tipo de servicio de sistema (en realidad es solo un analizador de registros) escrito en Python. Este programa debería funcionar de forma continua durante un tiempo prolongado (con suerte, me refiero a días y semanas sin fallas y necesidades de reinicio). Por eso me preocupa el consumo de memoria.
Reuní información diferente sobre el uso de memoria de proceso de diferentes sitios en una función simple:
#!/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]))
Esta función se ha utilizado para estudiar la dinámica del consumo de memoria de mi proceso de larga duración, y todavía no puedo explicar su comportamiento. Puede ver que el tamaño del montón y la cantidad total de los objetos no cambiaron, mientras que la memoria física y virtual aumentaron en un 11% y 1% durante estos veinte minutos.
UPD: El proceso ha estado funcionando durante casi 15 horas en este momento. El montón sigue siendo el mismo, pero la memoria física se multiplicó por seis y la memoria virtual aumentó en un 50%. La curva parece ser lineal a excepción de los valores atípicos extraños a las 3:00 AM:
Tiempo Obj Heap 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
Me pregunto qué está pasando con el espacio de direcciones de mi proceso. El tamaño constante del montón sugiere que todos los objetos dinámicos se desasignan correctamente. Pero no tengo dudas de que el consumo creciente de memoria afectará la sostenibilidad de este proceso crítico para la vida a largo plazo.
¿Alguien podría aclarar este tema por favor? Gracias.
(Yo uso RHEL 6.4, kernel 2.6.32-358 con Python 2.6.6)