我使用的是用Python 3.5编写的websocket服务器。这是提供我的网站实时信息所必需的。
我使用的"服务器" -library被称为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脚本从24h开始没有重启,那么如果连接了大约300个客户端,则会弹出这些错误。如果我在此期间重新启动脚本,即使重新连接所有人,一切都会正常工作。
我真的不知道该怎么办,因为好像龙卷风没有正确关闭证书文件并在每个新连接上再次加载它们。
答案 0 :(得分:1)
龙卷风可能不会泄漏文件句柄;它只是一段时间后达到极限的龙卷风,因为它经常打开文件。
获取相关流程的PID并查看/proc/[PID]/fd
。它将列出当前打开的所有文件句柄。如果您的代码由于某种原因使文件保持打开状态,那么它们就会堆积在那里。