CentOS, 解決伺服器存在大量time_wait的問題,centostime_wait
近期伺服器出現大量time_wait的TCP串連造成伺服器串連數過多而最終導致tomcat假死狀態。串連伺服器查看串連數的時候提示如下。
[root@test apache-tomcat-7.0.53]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 14434FIN_WAIT2 6ESTABLISHED 133
很明顯可以看出是請求太多頻繁,主要由於後端伺服器之間是通過rest請求相互調用的,而java伺服器回收tcp線程速度比較慢,雖然已經有顯性的關閉串連了,但是實際在調
用的時候串連回收還是較慢。通過java API解決這個問題的路子就堵死了。
後來去伺服器查閱了大量資料,可以考慮通過修改linux核心的方式解決此處問題。解決方案如下:
vi /etc/sysctl.conf
添加配置資訊
#表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊。預設為0,表示關閉net.ipv4.tcp_syncookies = 1#表示開啟重用tcp串連。允許將TIME-WAIT sockets重新用於新的TCP串連。預設為0,表示關閉net.ipv4.tcp_tw_reuse = 1#表示開啟TCP串連中TIME-WAIT sockets的快速回收。預設為0,表示關閉net.ipv4.tcp_tw_recycle = 1#表示如果通訊端由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間 net.ipv4.tcp_fin_timeout = 30
讓參數配置生效
/sbin/sysctl -p
返回結果
問題完美解決:
[root@test apache-tomcat-7.0.53]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 96FIN_WAIT2 3ESTABLISHED 141