2017-04-26 50 views
0

我正在使用Python 3.5编码的websocket服务器。这是需要提供我的网站实时信息。Python龙卷风操作系统错误24打开的文件太多

我使用的“服务器” - 库称为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客户端连接。如果我在这段时间重新启动脚本,即使每个人都重新连接后,一切都会正常工作。

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

回答

1

龙卷风泄漏文件句柄可能并非如此;它只是龙卷风,经过一段时间后达到极限,因为它经常打开文件。

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

+0

我试过了,我也统计了所有进程和它们使用的文件描述符。我观看了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(ESTABLISHED)。这是(泄漏)龙卷风的websocket连接? – DoNotClick

+0

那些套接字并没有完全泄露,因为它们是'ESTABLISHED',也就是说,仍然处于开放状态并准备就绪。也许你的websocket库在websocket停业后关闭了tcp连接? – user2722968

+0

我在我的网站上有一些在线计数器,它可以统计所有当前连接的数组。如果库调用on_open和on_close事件,则特定的连接将被删除或添加到数组中,这样我可以看到当前有多少客户端在线。大多数情况下,这个数字在100-300之间,似乎并不包含任何死连接,但进程的tcp连接总是增加。另外,打开和关闭事件被正确调用,所以连接没有关闭或者它可能只是一个sockjs-tornado bug? – DoNotClick