2012-05-03 14 views
7

Próbowałem użyć tornado-redis (która jest w zasadzie rozwidleniem brükva nieznacznie zmodyfikowanym do pracy z interfejsem tornado.gen zamiast adisp) w celu dostarczania zdarzeń za pomocą redis' pubsub.Jak mogę śledzić/naprawiać wyciek pamięci w tornado-redis za pomocą narzędzia pympler?

Więc zapisałem mały skrypt, aby przetestować rzeczy inspirowane this example.

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

Niestety, jak ja PUBLISH ed przez redis-cli zużycie pamięci przechowywane na rosnące.

W celu profilowania użycia pamięci najpierw próbowałem użyć guppy-pe, ale nie działałoby to pod pytonem 2.7 (tak, nawet wypróbowałem trunk), więc cofnąłem się do 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() 

Teraz za każdym razem PUBLISH ed widziałem, że niektóre obiekty nie zostały wydane:

          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 

Teraz wiem, że tam naprawdę przeciek pamięci, jak mogę śledzić gdzie te obiekty są tworzone? Chyba powinienem zacząć here?

Odpowiedz

4

Uaktualnienie Tornada do wersji 2.3 powinno rozwiązać ten problem.

Wystąpił ten sam problem, w którym wyjątek ExceptionStackContext wyciekał bardzo szybko. Było to związane z tym raportem o błędzie: https://github.com/facebook/tornado/issues/507 i poprawione w tym zatwierdzeniu: https://github.com/facebook/tornado/commit/57a3f83fc6b6fa4d9c207dc078a337260863ff99. Aktualizacja do wersji 2.3 zajęła się dla mnie problemem.

+0

Dziękuję bardzo za skierowanie mnie do tego problemu. Uaktualniłem i wyciek + spowolnienie minęło :) –