我使用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()
此代码以启动方式启动。
我的问题是如何调试此类问题。服务器已稳定了好几个月。我查看了所有新代码(在模块中)以获得可能的答案,但这些函数不会在没有客户端的情况下调用。
显然我已经做了一些导致这个问题的事情 - 但我不确定如何调试。
感谢您的帮助