2012-09-05 24 views
14

Tengo una aplicación de servidor python complicada, que se ejecuta constantemente todo el tiempo. A continuación hay una versión muy simplificada de esto.uso de memoria pypy crece para siempre?

Cuando ejecuto la aplicación a continuación usando python; "python Main.py". Usa 8mb de ram directamente, y se mantiene a 8mb de ram, como debería.

Cuando lo ejecuto usando pypy "pypy Main.py". Comienza con el uso de 22 mb de ram y con el tiempo crece el uso de ram. Después de 30 segundos está en 50mb, después de una hora está en 60mb.

Si cambio el "b.something()" para que sea "aprobado", no se engulle la memoria de esa manera.

Estoy usando pypy 1.9 en OSX 10.7.4 Estoy de acuerdo con que pypy use más memoria RAM que python.

¿Hay alguna manera de evitar que pypy consuma memoria durante largos períodos de tiempo?

import sys 
import time 
import traceback 

class Box(object): 
    def __init__(self): 
     self.counter = 0 
    def something(self): 
     self.counter += 1 
     if self.counter > 100: 
      self.counter = 0 

try: 
    print 'starting...' 
    boxes = []  
    for i in range(10000): 
     boxes.append(Box()) 
    print 'running!' 
    while True: 
     for b in boxes: 
      b.something() 
     time.sleep(0.02) 

except KeyboardInterrupt: 
    print '' 
    print '####################################' 
    print 'KeyboardInterrupt Exception' 
    sys.exit(1) 

except Exception as e: 
    print '' 
    print '####################################' 
    print 'Main Level Exception: %s' % e 
    print traceback.format_exc() 
    sys.exit(1) 

A continuación se muestra una lista de veces y el uso de memoria RAM en ese momento (lo dejé correr durante la noche).

Wed Sep 5 22:57:54 2012, 22mb ram 
Wed Sep 5 22:57:54 2012, 23mb ram 
Wed Sep 5 22:57:56 2012, 24mb ram 
Wed Sep 5 22:57:56 2012, 25mb ram 
Wed Sep 5 22:57:58 2012, 26mb ram 
Wed Sep 5 22:57:58 2012, 27mb ram 
Wed Sep 5 22:57:59 2012, 29mb ram 
Wed Sep 5 22:57:59 2012, 30mb ram 
Wed Sep 5 22:58:00 2012, 31mb ram 
Wed Sep 5 22:58:02 2012, 32mb ram 
Wed Sep 5 22:58:03 2012, 33mb ram 
Wed Sep 5 22:58:05 2012, 34mb ram 
Wed Sep 5 22:58:08 2012, 35mb ram 
Wed Sep 5 22:58:10 2012, 36mb ram 
Wed Sep 5 22:58:12 2012, 38mb ram 
Wed Sep 5 22:58:13 2012, 39mb ram 
Wed Sep 5 22:58:16 2012, 40mb ram 
Wed Sep 5 22:58:19 2012, 41mb ram 
Wed Sep 5 22:58:21 2012, 42mb ram 
Wed Sep 5 22:58:23 2012, 43mb ram 
Wed Sep 5 22:58:26 2012, 44mb ram 
Wed Sep 5 22:58:28 2012, 45mb ram 
Wed Sep 5 22:58:31 2012, 46mb ram 
Wed Sep 5 22:58:33 2012, 47mb ram 
Wed Sep 5 22:58:35 2012, 49mb ram 
Wed Sep 5 22:58:35 2012, 50mb ram 
Wed Sep 5 22:58:36 2012, 51mb ram 
Wed Sep 5 22:58:36 2012, 52mb ram 
Wed Sep 5 22:58:37 2012, 54mb ram 
Wed Sep 5 22:59:41 2012, 55mb ram 
Wed Sep 5 22:59:45 2012, 56mb ram 
Wed Sep 5 22:59:45 2012, 57mb ram 
Wed Sep 5 23:00:58 2012, 58mb ram 
Wed Sep 5 23:02:20 2012, 59mb ram 
Wed Sep 5 23:02:20 2012, 60mb ram 
Wed Sep 5 23:02:27 2012, 61mb ram 
Thu Sep 6 00:18:00 2012, 62mb ram 
+1

Hmm. No puedo reproducir esto Con pypy 1.9 (de Macports) y OS X 10.6.8, veo que el uso de la memoria (según lo informado por 'top', desde la columna RSIZE) se mantiene alrededor de los 46M. Puede valer la pena un informe de error. –

+0

Todavía tengo ese proceso ejecutándose, nuevo punto de datos para él: Jue 6 Sep 09:02:26 2012, 63mb RAM – DavidColquhoun

+2

Puedo reproducir esto usando pypy 1.8, pero 1.9 parece haber corregido este problema – goncalopp

Respuesta

10
+0

Vaya, comenté la respuesta incorrecta, moví mi comentario a la respuesta anterior. – DavidColquhoun

+2

4 meses después y me he dado cuenta de que lo que Ronny ha vinculado es una solución aún mejor. Configurar PYPY_GC_MIN = 1GB y PYPY_GC_MAX = 3GB funciona mucho mejor, manteniendo el uso del ram entre 1 y 3 gb. Y descubrí que las llamadas a gc.collect() tardaban unos 50 ms ... reduciendo demasiado mi aplicación. Entonces sí, esas variables de entorno son una forma mucho mejor de ir. :) – DavidColquhoun

+0

@DavidColquhoun que es 'PYPY_GC_MIN = 1GB' y' PYPY_GC_MAX = 3GB', no 'PYPY_GC_MIN =" 1GB "' y 'PYPY_GC_MAX =" 3GB "', ¿correcto? –

5

En comparación con CPython, PyPy utiliza different garbage collection strategies. Si el aumento en la memoria se debe a algo en su programa, podría intentar ejecutar una recolección forzada de elementos no utilizados de vez en cuando, utilizando la función collect del módulo gc. En este caso, también podría ayudar explícitamente a del objetos grandes que ya no necesita y que no salen del alcance.

Si se debe al funcionamiento interno de pypy, podría valer la pena enviar un informe de error, como sugirió Mark Dickinson.

+0

¡Gracias! gc.collect() era lo que necesitaba. Lo ejecuto cada pocos segundos y mantiene plano el uso de la memoria ... consulte el gráfico aquí para ver la diferencia que hizo un comando: http://datasmugglers.com/2012/10/06/server-ram-usage/ – DavidColquhoun