2017-04-26 72 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