Tornado.WebSocket和[Errno 24]文件打开太多

3

在本地机器上测试tornado.websocket时,我遇到了一个错误([Errno 24] Too many open files)。

server.py

import tornado.ioloop
import tornado.web
import tornado.websocket
import tornado.options


class ChatSocketHandler(tornado.websocket.WebSocketHandler):
    waiters = set()

    def open(self):
        ChatSocketHandler.waiters.add(self)
        print "Clients: ", len(ChatSocketHandler.waiters)

    def on_close(self):
        ChatSocketHandler.waiters.remove(self)

    @classmethod
    def send_updates(cls, chat):
        for waiter in cls.waiters:
            try:
                waiter.write_message(chat)
            except:
                logging.error("Error sending message", exc_info=True)

    def on_message(self, message):
        ChatSocketHandler.send_updates(message)

app = tornado.web.Application([
    (r"/ws", ChatSocketHandler)
])

def main():
    tornado.options.parse_command_line()
    app.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

clients.py (using websocket-client)

from multiprocessing import Pool, Process
from websocket import create_connection

def go():
    ws = create_connection("ws://127.0.0.1:8888/ws")

    while True:
        try:
            ws.send("Message ...")
            result =  ws.recv()
            print "Received '%s'" % result
        except KeyboardInterrupt:
            break
    ws.close()


for i in range(1000):
    Process(target=go).start()

服务器在处理大约800个连接后会崩溃。

另外一个问题:将Nginx代理设置到Tornado服务器实例上是否可行?我能从中获得一些好处吗?

1个回答

4
你的进程很可能会用尽文件描述符。这里有一个关于Linux网络调优的配方,包括如何增加最大文件描述符数。(这是为Crossbar.io准备的,但也适用于Tornado)。
至于你的问题“在Tornado前面放置Nginx是否有意义”,答案是肯定的。Tornado的本地TLS支持有限。请看Hynek Schlawack: The Sorry State of SSL - PyCon 2014 注意:后者不适用于Twisted(或基于Twisted的Crossbar.io),因为Twisted使用pyOpenSSL并可以实现高质量的TLS。所以这些情况下没有必要使用Nginx(至少不是出于TLS的原因)。

如果我没记错的话,将nginx放在tornado前面会增加tornado处理开放式websocket连接的能力和限制。 - Ishan Khare
不,它不会。它会遇到相同的问题。 - oberstet

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