Resin網頁伺服器執行lsof -i:8080 命令出現大量的ESTABLISHED連接
Resin服務的端口為8080,執行lsof -i:8080 命令出現大量的ESTABLISHED連接:
然後執行netstat -n | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}' 命令發現存在大量狀態為TIME_WAIT的連接:
簡單來說,
ESTABLISHED表示正在進行網絡連接的數量,
TIME_WAIT表示表示等待系統主動關閉網絡連接的數量,
CLOSE_WAIT表示被動等待程序關閉的網絡連接數量,因此TIME_WAIT跟服務器的配置有關,而CLOSE_WAIT跟程序進行網絡連接有關了,通常是程序沒有主動關閉網絡連接所致。
上圖中顯然TIME_WAIT的數量太多了,需要對服務器進行配置。對/etc/sysctl.conf 文件做如下設置(包含每個配置項的說明):
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
修改保存之後執行/sbin/sysctl -p讓參數生效即可。這裡需要說明幾點:
(1) net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle的開啟都是為了回收處於TIME_WAIT狀態的資源,net.ipv4.tcp_fin_timeout這個時間可以減少在異常情況下服務器從FIN-WAIT -2轉到TIME_WAIT的時間,net.ipv4.tcp_keepalive_*一系列參數,是用來設置服務器檢測連接存活的相關配置。
(2)如果客戶端訪問是NAT網絡,不要開啟net.ipv4.tcp_tw_recycle或者在服務端關閉time stamp (echo 0 /proc/sys/net/ipv4/tcp_timestamps),參考這篇文章:不要在linux上啟用net.ipv4.tcp_tw_recycle參數和【經驗總結】tcp_tw_recycle參數引發的故障。
(3) Windows服務器的解決方法請參考這篇文字:在Windows上遇到非常多TIME_WAIT連線時應如何處理。
另外如果出現大量的CLOSE_WAIT說明程序在進行網絡連接的時候沒有主動關閉連接,比如使用HttpClient調用網絡連接的時候,當出現錯誤的時候沒有調用abort()方法,或者網絡連接結束之後沒有調用close方法等等,具體在源代碼中進行排查即可
留言
張貼留言