解決-伺服器Linux存在大量time_wait的問題,導致服務效能問題,甚至嚴重的將訪問不了應用
netstat -an檢視到大量的TIME_WAIT狀態的解決辦法
近期伺服器出現大量time_wait的TCP連線造成伺服器連線數過多而最終導致tomcat假死狀態。連線伺服器檢視連線數的時候提示如下。
[[email protected] apache-tomcat-7.0.53]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 521
FIN_WAIT2 6
ESTABLISHED 133
很明顯可以看出是請求太多頻繁,主要由於後端伺服器之間是通過rest請求相互呼叫的,而java伺服器回收tcp執行緒速度比較慢,雖然已經有顯性的關閉連線了,但是實際在調
解決辦法是修改Linux核心引數,
修改系統socket最大連線數,在檔案/etc/security/limits.conf最後加入下面兩行:
* soft nofile 32768
* hard nofile 32768
或者縮小2MSL的時長、允許重用處於TIME_WAIT狀態的TCP連線、快速回收處於 TIME_WAIT狀態的TCP連線,修改/etc/sysctl.conf,新增如下幾行:
#改系統預設的TIMEOUT時間
net.ipv4.tcp_fin_timeout=2
#啟重用,允許將TIME_WAIT sockets重新用於新的TCP連線 預設為0表示關閉
net.ipv4.tcp_tw_reuse=1
#開啟TCP連線中TIME_WAIT sockets的快速回收 預設為0 表示關閉
net.ipv4.tcp_tw_recycle=1
對於windows環境,可通過修改登錄檔進行配置:
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
新增一個DWORD型別的值TcpTimedWaitDelay,值可以根據實際情況配置。
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
新增一個DWORD型別的值MaxUserPort ,值可以根據實際情況配置。
上面這些引數根據實際情況進行配置。