2013-11-19 3 views
5

Я пишу сервер веб-сокета в python. Я пробовал подход ниже с txws, autobahn и торнадо, все с аналогичными результатами.Python безопасное потребление памяти в сети

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

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

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

+5

OpenSSL по умолчанию выделяет много памяти для каждого подключения. Некоторые замечательные подробности в этом блоге - https://journal.paul.querna.org/articles/2011/04/05/openssl-memory-use/ –

+1

Удивительный! В этой статье было задано так много вопросов, и содержащиеся в ней решения действительно снизили потребление памяти. – sambev

ответ

1

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

+0

Почему вы не верите, что веб-серверы Python являются «реальными»? – Glyph

+0

Touché !! Я имел в виду реальность в том смысле, что есть модули, поддерживающие все, что было нанято на сервере http, открытом для мира (регистрация, предотвращение DoS, балансировка нагрузки, скомпилированная) – JulienFr

+1

+1 для @JulienFr, Python не должен подвергаться прямому воздействию общественной сети. Apache/Nginx написаны на языках более низкого уровня и сильно оптимизированы для единственной задачи, которую они имеют. –

Смежные вопросы