报错
我的预约挂号服务突然挂了,查看tomcat的端口号的时候出现,一堆的close_wait导致了我的tomcat假死,就算重启了,再看端口号也是一堆close_wait。
应急处理
因为是个网上预约挂号服务,不能停太久。
所以我没有查原因直接把所有占用我的端口的进程全杀了,然后重启,不管了,先恢复服务再查原因。
把占用端口的命令全杀了的命令:sudo kill -9 $(lsof -i:端口号 -t)
原因
查看最新日志catalina.out ,没有发现异常,也没有error 日志;查看localhost_access.log 也没有最新的访问日志,说明我这台tomcat 已不能提供服务了!
然后想到这个tomcat挂的时候正好内网出了问题,想到的是网络是问题
看看客户端已经断开连接,但服务器还在发送消息,讲道理服务器也应该要断开连接才对的。根据TCP的三次握手和四次挥手,这不对啊,
tomcat常用的三个状态是:
ESTABLISHED 正在通信
TIME_WAIT 主动关闭
CLOSE_WAIT 表示被动关闭。
避免再次出现该问题的方案
方案一
这个BUG很显然就是服务器端代码未能及时的释放资源所造成的,
可以通过以下途径修改Linux配置文件
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
然后执行 /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 时间
方案二
饿了,不想写了先存起来~