TCP连接出现很多TIME_WAIT

夙愿已清 提交于 2019-12-12 10:38:34

TCP连接出现很多TIME_WAIT

前言:

我为啥会发现呢,本来任务是发现pinpoint上有的请求时间等待间隙过长,为了查找出tomcat的api链路有等待的。我开始排查tcp的连接开始,然后再到tomcat的线程优化数。再检查到tcp连接的时候发现了大问题。

netstat -ant | grep 8080  | wc -l 

使用以上命令查看tomcat的连接数,忽然发现连接数500多,一时我惊到了,公司业务并没有达到那个级别,服务的并发连接数也就三四十是正常的。

然后我使用了另一个命令统计这台服务的tcp数

~$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  
LAST_ACK 1
CLOSE_WAIT 4
ESTABLISHED 144
TIME_WAIT 4234

然后看到结果,TIME_WAIT的状态连接是4234。再看ESTABLISHED的状态才144,这个很不正常。

tcp/ip协议我就不讲解了,因为我怕我讲的也不是很官方话,大家可以自己去了解下这些状态

这个出现大量TIME_WAIT,我检查了cpu负载,和内存,发现都还正常。这个话只会占用了连接的端口,可是这个也是个大问题。需要处理下。不然后边遇到大流量,或者攻击的话,会提前影响业务了。

一个TCP/IP连接断开以后,会通过TIME_WAIT的状态保留一段时间,时间过了才会释放这个端口,当端口接受的频繁请求数量过多的时候,就会产生大量的TIME_WAIT状态的连接,这些连接占着端口,会消耗大量的资源。

解决:

1、打开/etc/sysctl.conf文件,修改TCP/IP内核参数。(建议先备份一下旧的文件,养成习惯。)

vim  /etc/sysctl.conf
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   #修改系統默认的 TIMEOUT 时间。

# 下边几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。这几个参数的含义如下:
net.ipv4.tcp_keepalive_time = 1200  #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 10000 65000  #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到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拖死。

2、修改完后执行

sysctl -p 

然后就可以了。可以再使用命令检查下。tcp的TIME_WAIT状态数。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!