`
phipray
  • 浏览: 64483 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

系统连接time wait过多问题解决方案

 
阅读更多

在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

 

 

  • 大小: 71.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics