Linux實例中出現(xiàn)大量CLOSE_WAIT狀態(tài)的TCP連接
發(fā)布時間:2021-02-24 點擊數(shù):1817
問題現(xiàn)象
執(zhí)行以下命令,發(fā)現(xiàn)當前系統(tǒng)中處于CLOSE_WAIT狀態(tài)的TCP連接非常多。
netstat -atn|grep CLOSE_WAIT|wc -l
原因分析
根據(jù)實例上的業(yè)務量判斷CLOSE_WAIT數(shù)量是否超出了正常的范圍。TCP連接斷開時需要進行四次揮手,TCP連接的兩端都可以發(fā)起關閉連接的請求,若對端發(fā)起了關閉連接,但本地沒有關閉連接,那么該連接就會處于CLOSE_WAIT狀態(tài)。雖然該連接已經(jīng)處于半開狀態(tài),但是已經(jīng)無法和對端通信,需要及時的釋放該連接。建議從業(yè)務層面及時判斷某個連接是否已經(jīng)被對端關閉,即在程序邏輯中對連接及時關閉,并進行檢查。
解決方法
編程語言中對應的讀、寫函數(shù)一般包含了檢測CLOSE_WAIT狀態(tài)的TCP連接功能,可通過執(zhí)行以下命令,查看當前實例上處于CLOSE_WAIT狀態(tài)的連接數(shù)。
netstat -an|grep CLOSE_WAIT|wc -l
Java語言和C語言中關閉連接的方法如下:
Java語言
- 通過read方法來判斷I/O 。當read方法返回-1時,則表示已經(jīng)到達末尾。
- 通過close方法關閉該連接。
C語言
檢查read的返回值。
- 若等于0,則可以關閉該連接。
-
若小于0,則查看error,若不是AGAIN,則同樣可以關閉連接。
