我正在使用Python 3.5编码的Websocket服务器。这是提供我的网站实时信息所必需的。

我使用的“服务器”库称为tornado(版本4.3),用于处理websocket连接和http请求。为了向后兼容(如果浏览器尚不支持websocket),我使用python库sockjs-tornado(版本1.0.3),该库还为websocket连接添加了一些其他功能。

此连接使用协议wss://,因此已加密并为套接字连接加载证书。问题是服务器运行了一段时间后出现错误。

ERROR:tornado.application:Exception in callback (<socket.socket fd=18, family=AddressFamily.AF_INET, type=2049, proto=6, laddr=('***', 8443)>, <function wrap.<locals>.null_wrapper at 0x6fbeea4769d8>)
Traceback (most recent call last):
  File "/home/website/python/tornado/ioloop.py", line 883, in start
    handler_func(fd_obj, events)
  File "/home/website/python/tornado/stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
  File "/home/website/python/tornado/netutil.py", line 274, in accept_handler
    callback(connection, address)
  File "/home/website/python/tornado/tcpserver.py", line 239, in _handle_connection
    do_handshake_on_connect=False)
  File "/home/website/python/tornado/netutil.py", line 510, in ssl_wrap_socket
    context = ssl_options_to_context(ssl_options)
  File "/home/website/python/tornado/netutil.py", line 487, in ssl_options_to_context
    context.load_cert_chain(ssl_options['certfile'], ssl_options.get('keyfile', None))
OSError: [Errno 24] Too many open files


我已经增加了Linux服务器上打开文件的限制,但是如果自24小时以来未重新启动python脚本,则如果连接了约300个客户端,则将弹出这些错误。如果我在这段时间内重新启动脚本,即使所有人重新连接后,一切都将再次正常运行。

我真的不知道该怎么办,因为龙卷风似乎没有正确关闭证书文件,并在每个新连接上再次加载它们。

最佳答案

龙卷风可能不会泄漏文件句柄。只是龙卷风过了一段时间才达到极限,因为它会定期打开文件。

获取有关进程的PID,然后查看/proc/[PID]/fd。它将列出当前打开的所有文件句柄。如果您的代码由于某种原因使文件保持打开状态,它们将堆积在那里。

10-07 19:52
查看更多