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

通過這條指令可以檢查:
#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