apple 2011-11-4 21:24
大量 close_wait 的生成原因與解決方法
<P>在 Linux 上 用netstat 統計資料如下,這樣可以統計目前連線狀態:</P>
<P><BR>[root@adj]# <FONT color=red>netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'<BR></FONT>LAST_ACK 3<BR>SYN_RECV 10<BR>CLOSE_WAIT 655<BR>ESTABLISHED 200</P>
<P><BR>大量 CLOSE_WAIT 的影響:<BR>大量的CLOSE_WAIT連接,直接佔滿TCP隊列,導致Apache失去回應,CPU 使用量 快速提高</P>
<P><BR>***************************************************************************</P>
<P>CLOSE_WAIT狀態的生成原因</P>
<P>如果是CLIENT端主動斷掉當前連接的話,那麼雙方關閉這個TCP連接共需要四個packet:</P>
<P>Client ---> FIN ---> Server </P>
<P>Client <--- ACK <--- Server </P>
<P>這時候Client端處於FIN_WAIT_2狀態;而Server 程序處於CLOSE_WAIT狀態。</P>
<P>Client <--- FIN <--- Server </P>
<P>這時Server 發送FIN給Client,Server 就成為LAST_ACK狀態。</P>
<P>Client ---> ACK ---> Server </P>
<P>Client回應了ACK,那麼Server 才會成為CLOSED狀態。</P>
<P>******************************************************************************</P>
<P><BR><FONT color=blue size=4>解決方法:</FONT><BR>1.<FONT color=red>vi /etc/sysctl.conf</FONT></P>
<P>加上底下設定</P>
<P>[quote]<BR># Decrease the time default value for tcp_fin_timeout connection<BR>net.ipv4.tcp_fin_timeout = 30<BR># Decrease the time default value for tcp_keepalive_time connection<BR>net.ipv4.tcp_keepalive_time = 1800<BR># 探測次數<BR>net.ipv4.tcp_keepalive_probes=2<BR># 探測間隔秒數<BR>net.ipv4.tcp_keepalive_intvl=2</P>
<P>[/quote]</P>
<P> </P>
<P>編輯完 /etc/sysctl.conf,要執行指令讓設定生效<BR>[root@adj /]# <FONT color=red>sysctl -p</FONT></P>
<P> </P>
<P>From: http://tw.myblog.yahoo.com/robin-li/article?mid=1394</P>