• 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

  • 相关阅读:
    [四天学会ajax]JavaScript 和 Ajax 发出异步请求
    Visual studio 2010 中文版正式版无法安装Silverlight4 Tools的解决办法
    第一范式,第二范式,第三范式
    [四天学会ajax]利用 DOM 进行 Web 响应
    input 提示功能 CSS
    Asp.net中,从弹出窗体取选择值(转)
    WCF 学习笔记(二)
    网络流量监控程序
    VC.net 2005 中CString转成char *
    WCF 学习笔记(一)
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/7329488.html
Copyright © 2020-2023  润新知