1. 程式人生 > >CLOSE_WAIT過多,Jetty伺服器無響應

CLOSE_WAIT過多,Jetty伺服器無響應

一開始,記錄到的資訊只有網路方面的資料,包括併發數和網路引數,如下:
321(專案的併發數)

TIME_WAIT 533
CLOSE_WAIT 970
FIN_WAIT1 25
FIN_WAIT2 46
ESTABLISHED 592
SYN_RECV 9
CLOSING 1
LAST_ACK 5

其中第一個資料的記錄命令為:netstat -an |grep ‘ESTABLISHED’ |grep -i ‘7901’ |wc -l (其中7901是web伺服器埠)
第二個資料的記錄命令為:netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
當然這部分的資料,也可以用Zabbix監控,圖形介面,更方便檢視和分析。

根據網上的資料,大部分都是調整Linux網路引數,主要是以下三個:(可以參考http://lvxuehu.iteye.com/blog/452487)
net.ipv4.tcp_keepalive_time=60
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_keepalive_intvl=3

修改這些引數,只能治標不能治本。

後面想到的是通過java的工具,查看出現問題時的堆疊資訊。結果發現線上的伺服器並沒有jstack命令,排查發現原來的運維裝的是jre,而不是jdk(汗)。完美的錯過了一次記錄出現問題資訊的記錄。最後通過命令:jstack -l 9430 記錄當時的堆疊資訊。問題出在有一個地方處理慢,在最外層有影響全域性的大鎖。所有的處理都處理等待情況,出現阻塞。

總結:出現線上故障時,儘可能多的記錄當時的資訊,有利於後面定位排查問題,解決的方法才能處理到點上。
CLOSE_WAIT問題根源還是在伺服器上,需要從自己的程式碼入手。