Linux网络tcp连接大量CLOSE_WAIT和TIME_WAIT状态的出现和解决方法
来源:互联网 发布:学播音主持软件 编辑:程序博客网 时间:2024/05/16 07:26
关于CLOSE_WAIT和TIME_WAIT状态,服务器端都有可能出现,TIME_WAIT出现应该是短连接较多,需要通过修改内核参数解决,CLOSE_WAIT状态则是服务器程序可能有问题,服务器需要主动close,以及epoll多路复用模型中使用linger调整关闭等待时间
分析解决这类问题,关键在于对照tcp3次握手4次挥手过程来查找,对着图看和想最易理解了
http://blog.csdn.net/shootyou/article/details/6622226/
昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下:
http://blog.csdn.net/shootyou/article/details/6615051
里头的分析过程有提到,通过查看服务器网络状态检测到服务器有大量的CLOSE_WAIT的状态。
在服务器的日常维护过程中,会经常用到下面的命令:
它会显示例如下面的信息:
TIME_WAIT 814
CLOSE_WAIT 1
FIN_WAIT1 1
ESTABLISHED 634
SYN_RECV 2
LAST_ACK 1
常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。
具体每种状态什么意思,其实无需多说,看看下面这种图就明白了,注意这里提到的服务器应该是业务请求接受处理的一方:
这么多状态不用都记住,只要了解到我上面提到的最常见的三种状态的意义就可以了。一般不到万不得已的情况也不会去查看网络状态,如果服务器出了异常,百分之八九十都是下面两种情况:
1.服务器保持了大量TIME_WAIT状态
2.服务器保持了大量CLOSE_WAIT状态
因为Linux分配给一个用户的文件句柄是有限的(可以参考:http://blog.csdn.net/shootyou/article/details/6579139),而TIME_WAIT和CLOSE_WAIT两种状态如果一直被保持,那么意味着对应数目的通道就一直被占着,而且是“占着茅坑不使劲”,一旦达到句柄数上限,新的请求就无法被处理了,接着就是大量Too Many Open Files异常,tomcat崩溃。。。
下面来讨论下这两种情况的处理方法,网上有很多资料把这两种情况的处理方法混为一谈,以为优化系统内核参数就可以解决问题,其实是不恰当的,优化系统内核参数解决TIME_WAIT可能很容易,但是应对CLOSE_WAIT的情况还是需要从程序本身出发。现在来分别说说这两种情况的处理方法:
1.服务器保持了大量TIME_WAIT状态
这种情况比较常见,一些爬虫服务器或者WEB服务器(如果网管在安装的时候没有做内核参数优化的话)上经常会遇到这个问题,这个问题是怎么产生的呢?
从上面的示意图可以看得出来,TIME_WAIT是主动关闭连接的一方保持的状态,对于爬虫服务器来说他本身就是“客户端”,在完成一个爬取任务之后,他就会发起主动关闭连接,从而进入TIME_WAIT的状态,然后在保持这个状态2MSL(max segment lifetime)时间之后,彻底关闭回收资源。为什么要这么做?明明就已经主动关闭连接了为啥还要保持资源一段时间呢?这个是TCP/IP的设计者规定的,主要出于以下两个方面的考虑:
1.防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2.可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。
关于MSL引用下面一段话:
再引用网络资源的一段话:
也就是说HTTP的交互跟上面画的那个图是不一样的,关闭连接的不是客户端,而是服务器,所以web服务器也是会出现大量的TIME_WAIT的情况的。
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_keepalive_*
- Linux网络tcp连接大量CLOSE_WAIT和TIME_WAIT状态的出现和解决方法
- 解决服务器出现大量CLOSE_WAIT和TIME_WAIT连接的方法
- TCP连接状态:CLOSE_WAIT和TIME_WAIT
- TCP连接TIME_WAIT和CLOSE_WAIT状态
- TCP的CLOSE_WAIT和TIME_WAIT状态
- 回顾一下TCP/IP连建立断开,以及常见大量的TIME_WAIT和CLOSE_WAIT状态原因
- TCP的状态,兼谈Close_Wait和Time_Wait的状态
- TCP的状态兼谈Close_Wait和Time_Wait的状态
- TCP的状态兼谈Close_Wait和Time_Wait的状态
- TCP的状态兼谈Close_Wait和Time_Wait的状态
- TCP的状态兼谈Close_Wait和Time_Wait的状态
- TCP 情况下,TIME_WAIT 和 CLOSE_WAIT 状态
- linux服务器出现大量的TIME_WAIT状态的TCP连接的处理办法
- time_wait和close_wait状态
- linux服务器出现大量CLOSE_WAIT状态的连接
- linux服务器出现大量CLOSE_WAIT状态的连接
- close_wait状态和time_wait状态
- close_wait状态和time_wait状态
- Ubuntu12.04使用apt-get出错——更新软件源
- ionic上拉加载更多问题
- 基于直方图均衡化的水下激光图像处理(MATLAB仿真)
- 初识beta分布
- Linux系统/etc/init.d目录和/etc/rc.local脚本
- Linux网络tcp连接大量CLOSE_WAIT和TIME_WAIT状态的出现和解决方法
- MAVEN的几个问题的解决方案
- javascript(四)之window
- PAT 1103. Integer Factorization (30)
- IOS下的屏幕相关和AppIcon尺寸以及LaunchImage 简单介绍
- 【集成学习】Bagging与随机森林算法原理小结
- Mac下启动Apache
- 解决android webview https图片不显示问题
- 用JQuery实现Fix表头表格