¿Cómo puedo rastrear/arreglar la pérdida de memoria en tornado-redis usando pympler?

He estado tratando de usar tornado-redis (que es básicamente un tenedor de brukva ligeramente modificado para trabajar con la interfaz tornado.gen en lugar de adisp) para entregar eventos usando pubsub de redis.

Así que escribí un pequeño guión para probar las cosas inspirado por este ejemplo.

import os

from tornado import ioloop, gen
import tornadoredis


print os.getpid()

def on_message(msg):
    print msg

@gen.engine
def listen():
    c = tornadoredis.Client()
    c.connect()
    yield gen.Task(c.subscribe, 'channel')
    c.listen(on_message)

listen()

ioloop.IOLoop.instance().start()

Desafortunadamente, como yo PUBLISHed a través redis-cliel uso de la memoria siguió aumentando.

Para perfilar el uso de la memoria, primero intenté usar guppy-pe pero no funcionaría bajo python 2.7 (sí, incluso probé troncal), así que volví a Pympler.

import os

from pympler import tracker
from tornado import ioloop, gen
import tornadoredis


print os.getpid()

class MessageHandler(object):

    def __init__(self):
        self.memory_tracker = tracker.SummaryTracker()

    def on_message(self, msg):
        self.memory_tracker.print_diff()

@gen.engine
def listen():
    c = tornadoredis.Client()
    c.connect()
    yield gen.Task(c.subscribe, 'channel')
    c.listen(MessageHandler().on_message)

listen()

ioloop.IOLoop.instance().start()

Ahora cada vez que yo PUBLISHed pude ver que algunos objetos nunca fueron liberados:

                                            types |   # objects |   total size
===================================================== | =========== | ============
                                                 dict |          32 |     14.75 KB
                                                tuple |          41 |      3.66 KB
                                                  set |           8 |      1.81 KB
                                       instancemethod |          16 |      1.25 KB
                                                 cell |          22 |      1.20 KB
                          function (handle_exception) |           8 |    960     B
                                     function (inner) |           7 |    840     B
                                            generator |           8 |    640     B
                             <class 'tornado.gen.Task |           8 |    512     B
                           <class 'tornado.gen.Runner |           8 |    512     B
  <class 'tornado.stack_context.ExceptionStackContext |           8 |    512     B
                                                 list |           3 |    504     B
                                                  str |           7 |    353     B
                                                  int |           7 |    168     B
                           builtin_function_or_method |           2 |    144     B
                                                types |   # objects |   total size
===================================================== | =========== | ============
                                                 dict |          32 |     14.75 KB
                                                tuple |          42 |      4.23 KB
                                                  set |           8 |      1.81 KB
                                                 cell |          24 |      1.31 KB
                                       instancemethod |          16 |      1.25 KB
                          function (handle_exception) |           8 |    960     B
                                     function (inner) |           8 |    960     B
                                            generator |           8 |    640     B
                             <class 'tornado.gen.Task |           8 |    512     B
                           <class 'tornado.gen.Runner |           8 |    512     B
  <class 'tornado.stack_context.ExceptionStackContext |           8 |    512     B
                                               object |           8 |    128     B
                                                  str |           2 |    116     B
                                                  int |           1 |     24     B
                                                types |   # objects |   total size
===================================================== | =========== | ============
                                                 dict |          32 |     14.75 KB
                                                tuple |          42 |      4.73 KB
                                                  set |           8 |      1.81 KB
                                                 cell |          24 |      1.31 KB
                                       instancemethod |          16 |      1.25 KB
                          function (handle_exception) |           8 |    960     B
                                     function (inner) |           8 |    960     B
                                            generator |           8 |    640     B
                             <class 'tornado.gen.Task |           8 |    512     B
                           <class 'tornado.gen.Runner |           8 |    512     B
  <class 'tornado.stack_context.ExceptionStackContext |           8 |    512     B
                                                 list |           0 |    240     B
                                               object |           8 |    128     B
                                                  int |          -1 |    -24     B
                                                  str |           0 |    -34     B

Ahora que sé que realmente hay una pérdida de memoria, ¿cómo hago un seguimiento de dónde se crean esos objetos? Supongo que debería empezar aquí?

preguntado el 03 de mayo de 12 a las 13:05

1 Respuestas

Actualizar Tornado a la versión 2.3 debería solucionar este problema.

Estaba teniendo el mismo problema en el que ExceptionStackContext se filtraba muy rápidamente. Estaba relacionado con este informe de error: https://github.com/facebook/tornado/issues/507 y arreglado en este compromiso: https://github.com/facebook/tornado/commit/57a3f83fc6b6fa4d9c207dc078a337260863ff99. La actualización a 2.3 solucionó el problema por mí.

Respondido el 02 de junio de 12 a las 17:06

Muchas gracias por señalarme este problema. Actualicé y la fuga + desaceleración desapareció :) - Simón Charette

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.