2012-05-03 21 views
7

मैं का उपयोग कर घटनाओं को वितरित करने के लिए tornado-redis (जो मूल रूप से brükva का एक कांटा है जो adisp के बजाय tornado.gen इंटरफ़ेस के साथ काम करने के लिए संशोधित) का उपयोग करने का प्रयास कर रहा है।मैं पंपप्लर का उपयोग करके टॉरनाडो-रेडिस में मेमोरी लीक को कैसे ट्रैक/ठीक कर सकता हूं?

इसलिए मैंने 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() 

दुर्भाग्य से, के रूप में मैं redis-cli स्मृति के उपयोग के माध्यम से PUBLISH एड बढ़ती पर रखा।

मेमोरी उपयोग को प्रोफाइल करने के लिए मैंने पहले guppy-pe का उपयोग करने की कोशिश की लेकिन यह अजगर 2.7 (हाँ भी कोशिश की गई ट्रंक) के तहत काम नहीं करेगा, इसलिए मैं 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() 

अब हर बार मैं 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 
          <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 

अब मुझे पता है कि वहाँ वास्तव में एक स्मृति रिसाव है, मैं कैसे ट्रैक करते हैं, जहां उन ऑब्जेक्ट का निर्माण होगा? मुझे लगता है मुझे here शुरू करना चाहिए?

उत्तर

4

संस्करण 2.3 में टॉरनेडो को अपग्रेड करने से इस समस्या को ठीक करना चाहिए।

मुझे वही समस्या थी जहां ExceptionStackContext बहुत जल्दी लीक हो रहा था। यह इस बग रिपोर्ट से संबंधित था: https://github.com/facebook/tornado/issues/507 और इस प्रतिबद्धता में तय: https://github.com/facebook/tornado/commit/57a3f83fc6b6fa4d9c207dc078a337260863ff99। 2.3 में अपग्रेड करने से मेरे लिए इस मुद्दे का ख्याल रखा गया।

+0

मुझे इस मुद्दे पर इंगित करने के लिए बहुत बहुत धन्यवाद। मैं उन्नयन और रिसाव + मंदी दूर चला गया :) –