memory-leaks - Python 安全 websocket 内存消耗

标签 memory-leaks websocket twisted tornado autobahn

我正在用 python 编写一个网络套接字服务器。我已经用 txws、高速公路和 Tornado 尝试了下面的方法,都得到了相似的结果。

我似乎使用安全的 websockets 消耗了大量内存,我无法弄清楚这可能发生在哪里或为什么会发生。以下是 Tornado 中的示例,但我可以提供高速公路或 txws 中的示例。

import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import json 

class AuthHandler(tornado.websocket.WebSocketHandler):

    def open(self):
        print 'new connection for auth'

    def on_message(self, message):
        message = json.loads(message)
        client_id = message['client_id']
        if client_id not in app.clients:
            app.clients[client_id] = self
        self.write_message('Agent Recorded')

    def on_close(self):
        print 'auth connection closed'


class MsgHandler(tornado.websocket.WebSocketHandler):

    def open(self):
        print 'new connection for msg'

    def on_message(self, message):
        message = json.loads(message)
        to_client = message['client_id']
        if to_client in app.clients:
            app.clients[to_client].write_message('You got a message')

    def on_close(self):
        print 'msg connection closed'


app = tornado.web.Application([
    (r'/auth', AuthHandler),
    (r'/msg', MsgHandler)
])

app.clients = {}


if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(app, ssl_options={
        'certfile': 'tests/keys/server.crt',
        'keyfile': 'tests/keys/server.key'
    })
    http_server.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

在建立大约 10,000 个连接后,我发现我使用了大约 700MB 的内存与 SSL 相比,没有使用 43MB,除非我终止进程,否则我永远不会恢复它。问题似乎与建立的连接数量而不是发送的消息密切相关。

消费似乎与客户端无关(我编写了自己的客户端并尝试了其他客户端)。

安全的 websockets 真的比普通的 websockets 占用更多的内存吗?还是我的服务器代码没有正确实现它?

最佳答案

我认为最好的解决方案是使用真正的网络服务器(nginx apache)作为代理,让它管理 ssl 层。

关于memory-leaks - Python 安全 websocket 内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20078390/

相关文章:

memory-leaks - 使用复杂模型结构时何时调用 Backbone.Relational.store.unregister()

ios - 在 NSTimer 中调用 AFNetworking 导致严重的内存泄漏

c++ - QListWidget add Item() + setItemWidget() 内存泄漏

python - 为什么不能将 Deferred 传递给 Python Twisted 中的回调?

ios - addSubview 上的 Objective-C 内存泄漏

Java 网络应用程序作为服务运行失去网络连接

python - 通过node-red将Python连接到网页

java - 在WebSocketHandler中访问HTTP session (Spring-websocket)

python - 如何在 Twisted Klein 中异步执行代码?

python - 如何在 Python 中更新 GUI 窗口?