天天看點

系統連接配接time wait過多問題解決方案

在nginx和Tomcat的使用過程中發現在高并發的情況下Tomcat會出現即使記憶體、CPU尚未達到瓶頸的情況下增加接入線程數還是會很容易出現拒絕服務,Tomcat的jvm裡有大量的駐留請求線程,必須整鍊路重新開機才能清除掉這些駐留線程。

另外Tomcat有比較多斷開連接配接的日志

系統連接配接time wait過多問題解決方案

通過這條指令可以檢查:

#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

狀态:描述

CLOSED:無連接配接是活動的或正在進行

LISTEN:伺服器在等待進入呼叫

SYN_RECV:一個連接配接請求已經到達,等待确認

SYN_SENT:應用已經開始,打開一個連接配接

ESTABLISHED:正常資料傳輸狀态

FIN_WAIT1:應用說它已經完成

FIN_WAIT2:另一邊已同意釋放

ITMED_WAIT:等待所有分組死掉

CLOSING:兩邊同時嘗試關閉

TIME_WAIT:另一邊已初始化一個釋放

LAST_ACK:等待所有分組死掉

如發現系統存在大量TIME_WAIT狀态的連接配接,

1  調整nginx和Tomcat的參數

增加keepalived配置減少連接配接斷開

nginx:

#對前

 fastcgi_intercept_errors on;

 client_body_timeout 10;

 client_header_timeout 10;

 send_timeout 10;

 keepalive_timeout  50;

 client_body_buffer_size  4k;

 client_header_buffer_size 1k;

#對後

proxy_connect_timeout 60;

proxy_send_timeout 60;

proxy_read_timeout 60;

proxy_buffer_size 512k;

proxy_buffers 6 512k;

proxy_busy_buffers_size 512k;

proxy_temp_file_write_size 512k;

#在upstream配置中設定

keepalive 120;

Tomcat:

protocol="org.apache.coyote.http11.Http11Nio2Protocol"

connectionTimeout="15000" 

acceptCount="100"

acceptorThreadCount="2"

keepAliveTimeout="-1"

maxKeepAliveRequests="200"

maxThreads="300"

minSpareThreads="25"

maxPostSize="0"

redirectPort="8443"

2  通過調整核心參數解決,

vim /etc/sysctl.conf

編輯檔案,加入以下内容:

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_timestamps = 1

net.ipv4.tcp_keepalive_time = 1200 

#net.ipv4.ip_local_port_range = 65000 

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_max_tw_buckets = 5000

#net.bridge.bridge-nf-call-ip6tables = 0

#net.bridge.bridge-nf-call-iptables = 0

#net.bridge.bridge-nf-call-arptables = 0

然後執行 /sbin/sysctl -p 讓參數生效。

net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉;

net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許将TIME-WAIT sockets重新用于新的TCP連接配接,預設為0,表示關閉;

net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接配接中TIME-WAIT sockets的快速回收,預設為0,表示關閉。

net.ipv4.tcp_fin_timeout 修改系?預設的 TIMEOUT 時間

net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉;

net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許将TIME-WAIT sockets重新用于新的TCP連接配接,預設為0,表示關閉;

net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接配接中TIME-WAIT sockets的快速回收,預設為0,表示關閉。

net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀态的時間。

net.ipv4.tcp_keepalive_time = 1200 表示當keepalive起用的時候,TCP發送keepalive消息的頻度。預設是2小時,改為20分鐘。

net.ipv4.ip_local_port_range = 1024 65000 表示用于向外連接配接的端口範圍。預設情況下很小:32768到61000,改為1024到65000。

net.ipv4.tcp_max_syn_backlog = 8192 表示SYN隊列的長度,預設為1024,加大隊列長度為8192,可以容納更多等待連接配接的網絡連接配接數。

net.ipv4.tcp_max_tw_buckets = 5000 表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字将立刻被清除并列印警告資訊。

默  認為180000,改為5000。對于Apache、Nginx等伺服器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對于Squid,效果卻不大。此項參數可以控制TIME_WAIT套接字的最大數量,避免Squid伺服器被大量的TIME_WAIT套接字拖死。

net.ipv4.tcp_tw_reuse = 1 reuse是表示是否允許重新應用處于TIME-WAIT狀态的socket用于新的TCP連接配接;

net.ipv4.tcp_tw_recycle = 1  recyse是加速TIME-WAIT sockets回收。

 參考自:

http://kerry.blog.51cto.com/172631/105233/

http://blog.csdn.net/gloria_y/article/details/11733049

http://www.cnblogs.com/discuss/articles/1866851.html