1

我正在使用用 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 服务器上打开文件的限制,但是如果 python 脚本在 24 小时后没有重新启动,那么如果连接了大约 300 个客户端,就会弹出这些错误。如果我在这段时间内重新启动脚本,一切都会再次正常运行,即使在每个人都重新连接之后也是如此。

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

4

1 回答 1

2

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

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

于 2017-04-26T20:19:41.477 回答