Я пишу сервер веб-сокетов в python. Я пробовал описанный ниже подход с txws, autobahn и 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 подключений, я обнаружил, что использую около 700 МБ памяти с SSL по сравнению с 43 МБ без него, и я никогда не верну его, если не убью процесс. Похоже, проблема тесно связана с количеством установленных соединений, а не с отправленными сообщениями.
Кажется, что потребление происходит независимо от клиента (я написал свой собственный клиент и пробовал другие клиенты).
Действительно ли безопасные веб-сокеты требуют больше памяти, чем обычные веб-сокеты? Или мой серверный код не реализует его правильно?