天天看點

TCP協定--CLOSE_WAIT狀态

1.伺服器異常

如果伺服器出了異常,十之八九都是以下兩種情況:

1.伺服器保持了大量TIME_WAIT狀态

2.伺服器保持了大量CLOSE_WAIT狀态

TCP協定--CLOSE_WAIT狀态

因為linux配置設定給一個使用者的檔案句柄是有限的,而TIME_WAIT和CLOSE_WAIT兩種狀态如果一直被保持,那麼意味着對應數目的通道就一直被占着,一旦達到句柄數上限,新的請求就無法被處理了,接着應用程式可能傳回大量Too Many Open Files異常。

2.Close_Wait引發的問題 Close_Wait會占用一個連接配接,網絡可用連接配接小。數量過多,可能會引起網絡性能下降,并占用系統非換頁記憶體。 尤其是在有連接配接池的情況下(比如HttpRequest) 會耗盡連接配接池的網絡連接配接數,導緻無法建立網絡連接配接。

3.解決方法

下面來讨論下這兩種情況的處理方法,優化系統核心參數解決TIME_WAIT可能很容易,可以通過修改/etc/sysctl.conf檔案解決;

但是應對CLOSE_WAIT的情況還是需要從程式本身出發。因為發生TIME_WAIT的情況是伺服器自己可控的,要麼就是對方連接配接的異常,要麼就是自己沒有迅速回收資源,總之不是由于自己程式錯誤導緻的。從上面的圖可以看出來,如果一直保持在CLOSE_WAIT狀态,那麼隻有一種情況,就是在對方關閉連接配接之後伺服器程式自己沒有進一步發出FIN信号,一般原因都是TCP連接配接沒有調用關閉方法。換句話說,就是在對方連接配接關閉之後,程式裡沒有檢測到,或者程式壓根就忘記了這個時候需要關閉連接配接,于是這個資源就一直被程式占着。這種情況,通過伺服器核心參數也沒辦法解決,伺服器對于程式搶占的資源沒有主動回收的權利,除非終止程式運作,一定程度上,可以使用TCP的KeepAlive功能,讓作業系統替我們自動清理掉CLOSE_WAIT連接配接。