我们最近将Flask-RQ2(RQ + Redis)添加到了Flask-SocketIO应用程序中。我们正在使用Eventlet驱动套接字io。目的是让Websocket将繁重的工作交给后端。
不过,在添加RQ代码时,我们的流程已开始定期固定其核心并完全降低性能。重新启动会将应用程序保存一小段时间,但只能保存一小会儿。
我的假设是,eventlet未能按预期的那样成功完成redis.connection.socket
的猴子补丁,因此它仍然是一个阻塞的暗示并驱动负载。但是,我们按照here-import eventlet
的规定使用eventlet,而eventlet.monkeypatch()
是我们主模块的第二行。我们使用socketio.run(APP, debug=APP.config['DEBUG'], host=APP.config['HOST'], port=APP.config['PORT'])
运行strace尝试找出挂住该进程的过程时,我看到类似wait4(11, 0x7ffe0b2689fc, WNOHANG, NULL) = 0
的内容。另外(也许不相关),当CPU处于运行状态时,我在lsof输出中看到了两个标记为[eventpoll]
的fds,而一个快乐的进程只显示了一个。
文件描述符泄漏是我对WNOHANG
消息的一种解释(请参阅here),但是除了多个[eventpoll]
fds之外,我看不到任何危险的东西。
任何想法或建议将不胜感激!我们正在使用Python 3.6,flask 0.12.2,flask-rq2 18.0,flask-socketio 3.0.1和redis 2.10.6。