linux 下Time_wait过多问题解决

问题原由:web

本身开发了一个服务器和客户端,经过短链接的方式来进行通信,因为过于频繁的建立链接,致使系统链接数量被占用,不能及时释放。看了一下18888,当时吓到了。服务器


现象:cookie

一、外部机器不能正常链接SSHtcp

二、内向外不可以正常的ping经过,域名也不能正常解析。spa


问题排查:.net

经过 netstat  -anp | grep TIME_WAIT | wc -l 命令查看数量,发现TIME_WAIT的链接数量超过了18000太夸张了。code

一、初步怀疑是程序没有关闭链接,codereview了两遍,发现,已经正常关闭。orm

二、网上看TIME_WAIT产生的缘由,多是由于服务器主动关闭链接致使TIME_WAIT产生。ip

三、查找TIME_WAIT解决方案:ci

发现系统存在大量TIME_WAIT状态的链接,经过调整内核参数解决,
vi /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

而后执行 /sbin/sysctl -p 让参数生效。


通过配置后,暂时的问题是解决了,再查看TIME_WAIT数量快速降低。


关键命令:

一、netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

会获得相似下面的结果,具体数字会有所不一样:

LAST_ACK 1
SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669

状态:描述
CLOSED:无链接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个链接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个链接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另外一边已赞成释放
ITMED_WAIT:等待全部分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另外一边已初始化一个释放
LAST_ACK:等待全部分组死掉


二、sysctl -a | grep time | grep wait
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

相关文章
相关标签/搜索