Python安全Websocket内存消耗

5

我正在用Python编写一个WebSocket服务器。我已经尝试了txws、autobahn和tornado的方法,但结果都差不多。

使用安全的WebSocket时,我的内存消耗似乎非常大,我无法弄清楚为什么会发生这种情况。下面是一个在tornado中的例子,但我也可以提供在autobahn或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次连接后,我发现使用SSL时的内存占用量约为700MB,而不使用时仅为43MB,并且除非我杀掉进程,否则它永远不会还回来。似乎问题与建立的连接数量密切相关,而不是发送的消息数量。
这种内存消耗似乎与客户端无关(我编写了自己的客户端并尝试了其他客户端)。
安全Websockets真的比普通Websockets更加内存密集吗?还是我的服务器代码没有正确实现?

5
默认情况下,OpenSSL为每个连接分配了大量内存。此博客文章中提供了一些很好的细节 - https://journal.paul.querna.org/articles/2011/04/05/openssl-memory-use/ - Jean-Paul Calderone
1
太棒了!那篇文章回答了很多问题,其中的解决方案确实降低了内存消耗。 - sambev
1个回答

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

你为什么不相信Python Web服务器是“真实的”? - Glyph
太棒了!我的意思是真正的,即具有支持在面向全球的http服务器中所需的所有模块(日志记录、DoS预防、负载平衡、编译等)的功能。 - julienfr112
1
+1 给 @JulienFr,Python 不应直接暴露在公共网络中。Apache / Nginx 是用低级语言编写的,并且针对它们所拥有的单一任务进行了大量优化。 - Ron E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接