调试龙卷风内存泄漏

时间:2018-05-01 19:42:22

标签: python memory-leaks tornado

我使用tornado和python构建了一个加密货币组合应用程序。 Tornado 4.4.2和pypy Python 2.7.13(84a2f3e6a7f8,2017年10月3日,11:00:55) [虚拟环境中的PyPy 5.9.0与GCC 6.2.0 20160901]。

直到最近,龙卷风还没有内存问题。

我正在使用带有SockJSConnection对象的websocket来更新网站上的实时信息。

我最近在套接字代码中没有改变任何内容,但我确实更新了一些导入的模块,并且我调用了函数。

突然服务器正在关闭,检查事件日志我可以看到操作系统(Linux Ubuntu 16.04.3 LTS)由于内存而终止进程。

我注意到即使没有网络客户端,内存也只是开始向上爬行。当有客户端获取数据时(这是非常数据密集型应用程序),它会更快地炸毁内存。

使用print语句我可以看到它在空闲时没有发生任何事情,除了我运行代码(从未改变过)以终止与已退出的客户端的连接。我使用periodicCallback在60秒内再次检查 -

clients = []#维护与服务器的打开套接字连接的Web客户端列表

def ScheduleSocketCleaning():

print "Started ScheduleSocketCleaning()"

def cleanSocketHouse():
    n = pendulum.now(tz='America/New_York').to_datetime_string()
    print "checking sockets @ %s"%n
    if clients:
        for x in clients:
            print "found client "+ x.id + " "+x.ipaddress +" "+x.is_closed
        clients[:] = [y for y in clients if not y.is_closed]
    else: print "no clients at this time"

loop = tornado.ioloop.PeriodicCallback(cleanSocketHouse, 60000,
                                       io_loop=tornado.ioloop.IOLoop.instance())
loop.start()

此代码以启动方式启动。

我的问题是如何调试此类问题。服务器已稳定了好几个月。我查看了所有新代码(在模块中)以获得可能的答案,但这些函数不会在没有客户端的情况下调用。

显然我已经做了一些导致这个问题的事情 - 但我不确定如何调试。

感谢您的帮助

0 个答案:

没有答案