TCP连接的TIME_WAIT过多导致 Tomcat 假死

最近发现使用的Tomcat 7会经常假死。前端点击页面无任何反应,打开firebug,很多链接一直在等待服务器的反应。查看服务器的状态,CPU占用很少,最多不超过10%,一般只有2%,3%左右,内存占用倒是接近80, 90%。一开始怀疑是tomcat内存配置不够,但是打开 jvisualvm.exe 分析,发现Tomcat 占用的堆内存没有什么问题。因为是假死,所以最后怀疑到 tomcat的 链接数和 数据库的链接数的配置估计太小了。netstat -na 结果页显示很多time_wait.

查看各种状态的网络连接的数量:

1)Linux 使用命令:netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

上面的命令可以查出各种状态的网络连接的数量 2)windows使用命令:

netstat -n |find /i “time_wait” /c

netstat -n |find /i “close_wait” /c

netstat -n |find /i “established” /c

windows下没有awk,所以要一个一个状态的统计它们的数量。

结果是:

1)TIME_WAIT: 状态的连接达到了 709

sql server占用的TIME_WAIT最多,还有nginx, tomcat都有一些处于 TIME_WAIT状态。

2)并且最大的端口达到了 65327 ,六万多,几乎接近端口的最大值 65535.

因为是 Windows server 2008,不同Linux下的TCP的调优。

解决方法:将 TcpTimedWaitDelay 调到 30S,让 TIME_WAIT 状态的维持最多30S,默认是4分钟。

如何查看或设置TcpTimedWaitDelay

cmd中运行 regedit 命令,找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键

看看有没有  TcpTimedWaitDelay 项,有的话直接修改,没有的话创建一个并创建名为 TcpTimedWaitDelay 的新 REG_DWORD 值。 将此值设置为十进制 30,其为十六进制 0x0000001e。该值将等待时间设置为 30 秒。 停止并重新启动系统。 缺省值:0xF0,它将等待时间设置为 240 秒(4 分钟)。 建议值:最小值为 0x1E,它将等待时间设置为 30 秒。

修改之后,重启系统,在观察,TIME_WAIT在100左右徘徊。效果还是立竿见影的。几天来一直再也没有出现Tomcat假死的情况。

当然也可以同时 增大 MaxUserPort 的数值(2008最大值好像是 65535):

MaxUserPort :确定在应用程序从系统请求可用用户端口时,TCP/IP 可指定的最高端口号。默认是65535,可以调到10万.

如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键并创建名为 MaxUserPort 的新 REG_DWORD 值,比如设置成200000。

参见:http://www.cnblogs.com/tianzhiliang/articles/2400176.html

时间: 2024-10-19 16:12:52

TCP连接的TIME_WAIT过多导致 Tomcat 假死的相关文章

tomcat 假死

1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照.1.2编写背景最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况.简单描述下该台tomcat当时具体的表现:客户端请求没有响应,查看服务器端tomcat的进程是存活的,查看业务日志的时候发现日志停止没有任何最新的访问日志.连tomcat下面的catalina.log也没有任何访问记录,基本断定该台tomcat已不能提供服务.2 分

tomcat 假死现象(转)

1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况.简单描述下该台tomcat当时具体的表现:客户端请求没有响应,查看服务器端tomcat的进程是存活的,查看业务日志的时候发现日志停止没有任何最新的访问日志.连tomcat下面的catalina.log也没有任何访问记录,基本断定该台tomcat已不能提供服务.

Tomcat假死

具体的表现:客户端请求没有响应,查看服务器端 tomcat 的 java 进程存在,查看 tomcat 的 catalina.log,没有发现异常,也没有 error 日志,查看 localhost_access.log 也没有最新的访问日志,该台 tomcat 已不能提供服务. 根据前面的假死表象,最先想到的是网络是否出现了问题,于是开始从请求的数据流程开始分析.业务的架构采用的是 nginx + tomcat 的集群配置. 如果是网络的原因,可以从两个点进行分析. 1. 从前端到 nginx

TCP/IP详解--TCP连接中TIME_WAIT状态过多

转载自http://blog.csdn.net/yusiguyuan/article/details/21445883 TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的.仅仅是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接的时候会出现这个TIMEWAIT.服务器在处理客户端请求的时候,如果你的程序设计为服务器主动关闭,那么你才有可能需要关注这个TIMEWAIT状态过多的问题.如果你的服务器设计为被动关闭,那么你首先要关注的是CLOSE_WAIT. 原则

TCP连接(Time_Wait、Close_Wait)说明

修改Time_Wait和CLOSE_WAIT时间 修改Time_Wait参数的方法 (在服务端修改)Windows下在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters,添加名为TcpTimedWaitDelay的DWORD键,设置为30,以缩短TIME_WAIT的等待时间 解决CLOSE_WAIT的方法:(在客户端修改)1 一般原因都是TCP连接没有调用关闭方法.需要应用来处理网络链接关闭.2 对于Web请

TCP连接中time_wait在开发中的影响-搜人以鱼不如授之以渔

根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的

Tomcat假死的原因及解决方案

服务器配置:linux+tomcat 现象:Linux服务器没有崩,有浏览器中访问页面,出现无法访问的情况,没有报4xx或5xx错误(假死),并且重启tomcat后,恢复正常. 原因:tomcat默认最大连接数(线程数)200个,默认每一个连接的生命周期2小时(7200秒),tomcat使用http 1.1协议,而http1.1默认是长连接.tomcat接受处理完请求后,socket没有主动关闭,因此如果在2小时内,请求数超过200个,服务器就会出现上述假死现象. 解决方案1:及时断开socke

iOS侧滑手势导致的假死

最近做项目的时候遇到个非常奇怪的情况,点击cell的时候会莫名的假死,将程序进入后台再切回来假死消失,但是还是不能进行操作.遇到这个问题的时候也真是一头雾水,找了很多资料,也试了很多办法,依然不起作用.后台仔细研究出现假死的情况发现每次在点击控制器最左边的时候就会出现假死情况,想了想是否和自带的侧滑手势有关,然后写了测试程序,发现果然是这个手势在作怪. 代码结构 代码结构就很简单了,根控制器是tabBarController,然后是两个navigationController,导航栏控制器根控制

rabbitMQ队列处理导致连接池耗尽Tomcat假死问题排查处理

背景: 监听器针对RabbitMQ队列做业务数据处理 系统问题表现: 业务系统无法正常使用,所有请求均不予相应,报404异常 控制台问题表现: 接收队列数据的logger日志打印,但是相关sql不打印(之前sql打印) 报错异常: dbcp连接池(开始使用) [WARN ] 19:01:05.762 [SimpleAsyncTaskExecutor-1] o.h.util.JDBCExceptionReporter - SQL Error: 1040, SQLState: 08004 [ERRO