字體:  

大量 close_wait 的生成原因與解決方法

apple 發表於: 2011-11-04 21:24 來源: ADJ網路控股集團


在 Linux 上 用netstat 統計資料如下,這樣可以統計目前連線狀態:


[root@adj]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
LAST_ACK 3
SYN_RECV 10
CLOSE_WAIT 655
ESTABLISHED 200


大量 CLOSE_WAIT 的影響:
大量的CLOSE_WAIT連接,直接佔滿TCP隊列,導致Apache失去回應,CPU 使用量 快速提高


***************************************************************************

CLOSE_WAIT狀態的生成原因

如果是CLIENT端主動斷掉當前連接的話,那麼雙方關閉這個TCP連接共需要四個packet:

Client ---> FIN ---> Server

Client <--- ACK <--- Server

這時候Client端處於FIN_WAIT_2狀態;而Server 程序處於CLOSE_WAIT狀態。

Client <--- FIN <--- Server

這時Server 發送FIN給Client,Server 就成為LAST_ACK狀態。

Client ---> ACK ---> Server

Client回應了ACK,那麼Server 才會成為CLOSED狀態。

******************************************************************************


解決方法:
1.vi /etc/sysctl.conf

加上底下設定

QUOTE:


# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# 探測次數
net.ipv4.tcp_keepalive_probes=2
# 探測間隔秒數
net.ipv4.tcp_keepalive_intvl=2

 

編輯完 /etc/sysctl.conf,要執行指令讓設定生效
[root@adj /]# sysctl -p

 

From: http://tw.myblog.yahoo.com/robin-li/article?mid=1394