Потребление памяти безопасным веб-сокетом Python

Я пишу сервер веб-сокетов в 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 МБ без него, и я никогда не верну его, если не убью процесс. Похоже, проблема тесно связана с количеством установленных соединений, а не с отправленными сообщениями.

Кажется, что потребление происходит независимо от клиента (я написал свой собственный клиент и пробовал другие клиенты).

Действительно ли безопасные веб-сокеты требуют больше памяти, чем обычные веб-сокеты? Или мой серверный код не реализует его правильно?


person sambev    schedule 19.11.2013    source источник
comment
OpenSSL по умолчанию выделяет много памяти для каждого соединения. Несколько интересных подробностей в этом сообщении блога — journal.paul .querna.org/articles/2011/04/05/openssl-memory-use   -  person Jean-Paul Calderone    schedule 19.11.2013
comment
Потрясающий! Эта статья ответила на так много вопросов, а содержащиеся в ней решения действительно снизили потребление памяти.   -  person sambev    schedule 19.11.2013


Ответы (1)


Я думаю, что лучшее решение — использовать настоящий веб-сервер (nginx apache) в качестве прокси-сервера и позволить ему управлять уровнем ssl.

person JulienFr    schedule 04.02.2014
comment
Почему вы не верите, что веб-серверы Python существуют? - person Glyph; 10.02.2014
comment
Туше !! Я имел в виду реальный в том смысле, что есть модули, которые поддерживают все, что нужно на http-сервере, открытом для всего мира (логирование, предотвращение DoS, балансировка нагрузки, компиляция и т. д.) - person JulienFr; 17.02.2014
comment
+1 для @JulienFr, Python не должен быть напрямую доступен в общедоступной сети. Apache / Nginx написаны на языках более низкого уровня и сильно оптимизированы для одной задачи, которую они выполняют. - person Ron E; 19.06.2014