【问题标题】:Python tornado OS Error 24 Too many open filesPython龙卷风操作系统错误24打开的文件太多
【发布时间】:2017-04-26 19:29:47
【问题描述】:

我正在使用 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个客户端,就会弹出这些错误。如果我在这段时间内重新启动脚本,一切都会再次正常运行,即使在每个人都重新连接之后也是如此。

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

【问题讨论】:

  • 好问题,同样的问题。

标签: python python-3.x ssl tornado sockjs-tornado


【解决方案1】:

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

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

【讨论】:

  • 我试过这个,我还统计了所有进程和它们使用的文件描述符。我看了很久的python脚本,打开的文件不断增加。如果我使用命令 lsof -p [pid] 我会看到很多类似的行,看起来像这样: python3.5 27598 root 111u IPv4 18662513 0t0 TCP ns000.ip-000-000-000.eu:pcsync-https- >000.000.000.000:25467(已建立)。这是(泄露的)龙卷风的 websocket 连接吗?
  • 这些套接字并没有像ESTABLISHED 那样完全泄漏,也就是说,仍然打开并准备好进行业务。也许您的 websocket 库在 websocket 停业后确实关闭了 tcp 连接?
  • 我的网站上有某种在线计数器,用于计算所有当前连接的数组。如果库调用 on_open 和 on_close 事件,特定连接将被删除或添加到数组中,因此我可以看到当前有多少客户端在线。大多数时候这个数字在 100 - 300 之间,并且似乎不包含任何死连接,但是进程的 tcp 连接一直在增加。也正确调用了打开和关闭事件,因此连接没有关闭是没有意义的,或者它可能只是一个 sockjs-tornado 错误?
  • 这似乎是一个已知问题:groups.google.com/forum/#!topic/sockjs/DvnvKPybrD4
  • 那么我们怎样才能拥有超过 1024 个 websocket 连接呢?毕竟,这是 websocket 的目的,轻量级和持久性。我的 python 龙卷风不能有超过 1024 个连接
猜你喜欢
  • 2012-07-05
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多