2012-05-03 17 views
7

Tôi đã cố gắng sử dụng tornado-redis (về cơ bản là một ngã ba của brükva được sửa đổi một chút để làm việc với giao diện tornado.gen thay vì adisp) để phân phối sự kiện bằng cách sử dụng redis' pubsub.Làm thế nào tôi có thể theo dõi/sửa lỗi rò rỉ bộ nhớ trong cơn lốc xoáy bằng cách sử dụng pympler?

Vì vậy, tôi đã viết ra một kịch bản nhỏ để kiểm tra những điều được lấy cảm hứng từ 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() 

Thật không may, như tôi PUBLISH ed qua redis-cli sử dụng bộ nhớ tiếp tục tăng.

Để sử dụng bộ nhớ hồ sơ, trước tiên tôi đã cố gắng sử dụng guppy-pe nhưng không hoạt động dưới python 2.7 (Có cả cố gắng cố định) vì vậy tôi đã quay lại 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() 

Bây giờ mỗi lần tôi PUBLISH ed tôi có thể thấy rằng một số đối tượng không bao giờ được phát hành:

          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 

Bây giờ tôi biết có thực sự là một rò rỉ bộ nhớ, làm thế nào để tôi theo dõi nơi các đối tượng được tạo ra? Tôi đoán tôi nên bắt đầu here?

Trả lời

4

Nâng cấp Tornado lên phiên bản 2.3 sẽ khắc phục sự cố này.

Tôi gặp sự cố tương tự khi ExceptionStackContext bị rò rỉ rất nhanh. Nó có liên quan đến báo cáo lỗi này: https://github.com/facebook/tornado/issues/507 và được sửa trong cam kết này: https://github.com/facebook/tornado/commit/57a3f83fc6b6fa4d9c207dc078a337260863ff99. Nâng cấp lên 2.3 đã giải quyết vấn đề cho tôi.

+0

Cảm ơn bạn rất nhiều vì đã chỉ cho tôi sự cố này. Tôi nâng cấp và rò rỉ + chậm lại đi :) –