TIME-WAIT 存在导致无法启动新服务
问题描述
之前的一个服务挂机了 准备再次启动 但是怎么都起不来 发现端口占用 还是 TIME-WAIT
类型的
$ ss -ntlpau |grep 50020
tcp TIME-WAIT 0 0 10.104.2.132:50020 10.104.17.29:15101
tcp TIME-WAIT 0 0 10.104.2.132:50020 10.104.17.39:17403
tcp TIME-WAIT 0 0 10.104.2.132:50020 10.104.7.143:15104
tcp TIME-WAIT 0 0 10.104.2.132:50020 10.104.7.27:15101
检查内核参数
$ /sbin/sysctl -a |grep tcp_tw_
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
解决
编辑内核文件/etc/sysctl.conf,加入以下内容:
net.ipv4.tcp_tw_reuse = 1 # 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 # 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
然后执行 /sbin/sysctl -p 让参数生效.
然后等待5分钟左右,让系统把之前的 TIME-WAIT 回收走 ,再次启动服务即可
拓展:检查当前的 TIME_WAIT 个数
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
LAST_ACK 1
SYN_RECV 1
ESTABLISHED 17366
FIN_WAIT2 1
TIME_WAIT 154013
参考文档
解决Linux TIME_WAIT过多造成的问题:https://blog.csdn.net/zhangjunli/article/details/89321202