Как я могу отследить/исправить утечку памяти в tornado -redis с помощью pympler?

Я пытался использовать tornado -redis (, который в основном является ответвлением brükva , слегка модифицированным для работы с интерфейсом tornado.gen вместо adisp. )для доставки событий с помощью redis' pubsub .

Итак, я написал небольшой скрипт для проверки, вдохновленный этим примером .

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()

К сожалению, по мере PUBLISHпрохождения redis-cliиспользование памяти продолжало расти.

Чтобы профилировать использование памяти, я сначала попытался использовать guppy -pe , но это не сработало под python 2.7 (Да, я даже пробовал trunk ), поэтому я вернулся к пымплер .

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()

Теперь каждый раз, когда я PUBLISHредактировал, я видел, что некоторые объекты так и не были выпущены.:

                                            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
                             

Теперь, когда я знаю, что действительно существует утечка памяти, как мне отследить, где эти объекты были созданы? Думаю, мне следует начать здесь ?

7
задан Simon Charette 3 May 2012 в 12:36
поделиться