记一次大量CLOSE_WAIT的解决方案
问题:
Cannot send, channel has already failed: tcp://ip:61616
Javax.jms.JMSException: Cannot send, channel has already failed: tcp://ip:61616
应用连不上mq
解决方案:
一,分析思路:
1.现象:通过netstat 查看与61616相关的连接状况,发现130多个CLOSE_WAIT
2.是什么原因造成这么多的CLOSE_WAIT?
2.1 主要原因是某种情况下应用关闭了socket连接,但是mq忙于读或者写,没有关闭连接.
2.2 代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。
3.造成CLOSE_WAIT之后服务为啥连不上mq呢?
linux分配给一个用户的文件句柄是有限的,CLOSE_WAIT状态一直被保持,意味着对应数目的通道就一直被占着,一旦达到句柄数上线,新的请求就无法被处理了,应用程序可能会返回大量的Too many openfiles异常.
4.什么是CLOSE_WAIT?
4.1 mq为被连接端,java服务为主动方,在被动关闭情况下,mq已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态;
二,解决办法:
1.重启mq
2,linux下设置如下三个参数:
/proc/sys/net/ipv4/tcp_keepalive_time当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。
/proc/sys/net/ipv4/tcp_keepalive_intvl当探测没有确认时&#x