一、closewait多少算多?
在TCP連接關閉過程中,如果伺服器端先發起FIN分節,那麼此時伺服器會進入CLOSE_WAIT狀態,等待客戶端響應確認。客戶端向伺服器發送確認分節後,會變成TIME_WAIT狀態,等待2MSL的時間後才會關閉。由此可見,CLOSE_WAIT狀態只是個中間狀態,只是表示服務端等待客戶端的確認,如果CLOSE_WAIT狀態沒有過多,那就不會對伺服器產生太大影響。
在Linux系統中,通常建議如果某個TCP埠中CLOSE_WAIT狀態大於30,就要考慮是否有問題,並儘快解決問題。
二、伺服器出現closewait,會有什麼後果?
如果伺服器出現CLOSE_WAIT狀態,那麼可能會引起以下問題:
1、CLOSE_WAIT狀態太多可能會導致伺服器的埠耗盡,進而引起網路故障。
2、CLOSE_WAIT狀態太多可能會導致伺服器的TCP連接受到影響,連接越多,影響越大。
三、closewait timewait、close外套
在TCP連接結束過程中,當TCP連接發送FIN後,有一段時間等待對方響應確認。如果TCP連接的關閉方式不當可能會導致CLOSE_WAIT、TIME_WAIT等狀態。而TIME_WAIT狀態也是一個佔用資源的狀態,它持續時間大概是MSL,通常為30秒。如果沒有及時結束TIME_WAIT狀態也會導致伺服器資源浪費。
一些應用伺服器程序,如Nginx、Tomcat,有一些參數,可以對伺服器在處理CLOSE_WAIT這種情況時進行優化。比如,在Nginx中,可以調整worker_connections的大小,或者減少worker_processes的數量,這些都可以減少CLOSE_WAIT的出現。
四、服務端closewait解決方法
下面提供一些解決CLOSE_WAIT狀態過多的方法:
1、檢查應用程序的代碼,看是否有長時間運行,或者循環調用的情況。
# 示例1:Python中使用socket通信,需要手動關閉socket client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_sock.connect((ip,port)) #調用send()等函數 client_sock.close()
# 示例2:Java中使用Socket通信,要使用try-with-resources語句自動關閉Socket try(Socket socket = new Socket()) { // 一些操作 }
2、調整內核對TIME_WAIT狀態的處理方式
# 執行命令 echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle
3、調整系統對TIME_WAIT狀態的回收後的等待時間
# 執行命令(過早地回收會導致數據包丟失) echo "6" > /proc/sys/net/ipv4/tcp_fin_timeout
五、伺服器突然出現closewait
如果伺服器突然出現CLOSE_WAIT狀態,可能是代碼或者系統異常導致。可以根據一些異常信息,分析出可能的原因:
1、在Java程序中,如果使用class.getResourceAsStream()載入資源,有可能會記錄InputStream實例而忘了關閉,最終導致CLOSE_WAIT。
2、在Linux系統中,如果TCP連接啟用了SO_KEEPALIVE選項,那麼在通信鏈路出現故障時會延遲關閉,最終導致CLOSE_WAIT。
3、在使用Redis資料庫時,如果忘了關閉連接,龜速過程中會導致大量的時間等待和CLOSE_WAIT狀態。
結尾
以上是關於CLOSE_WAIT狀態的詳細闡述,可以從不同的角度理解CLOSE_WAIT狀態的含義,也可以了解CLOSE_WAIT狀態對伺服器的影響以及解決方案,在應用程序開發、伺服器運維以及網路調試中都具有重要的參考價值。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/244124.html