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?
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 :) –