`
welcome66
  • 浏览: 397150 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

服务器http连接出现大量TIME_WAIT问题的解决方法

阅读更多

 

最近用户的tomcat服务器上出现大量TIME_WAIT 状态的连接,导致后面的连接进不去,出现服务没有响应的情况。

首先使用命令查看当前的各种状态的数量:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'    

执行后,一般结果如下:

    TIME_WAIT 8

    CLOSE_WAIT 323

    SYN_SENT 1

    ESTABLISHED 6171

其中常用的三个状态是:

ESTABLISHED      表示正在通信

TIME_WAIT           表示主动关闭

CLOSE_WAIT        表示被动关闭

 

1.出现TIME_WAIT的原因

TCP建立一个连接至少需要交换三个分组,也因此称之为TCP的三路握手(three-way handshake),然而在TCP终止连接时,由于双方都需要发送一个FIN分节给对端确认,因此TCP终止连接一般是需要交换四个分节。具体来看: 
1) 应用进程(active close)首先调用close,于是导致TCP发送一个FIN分节,表示数据已分送完毕,请求关闭套接字。 
2) 另一端应用进程(passive close)接受收到FIN,并由该端的TCP确认(确认的过程是TCP发送ACK分节给对端套接字)。FIN的接受也作为文件结束符传递给上层应用进程。这里的文件结束符并非应用进程的EOF,在TCP字节流中,EOF的读或写通过收发一个特殊的FIN分节来实现。 
3) 另端(passive close)应用进程在接受到文件束符后,会调用close关闭它的套接字,这导致该端的TCP也发送了一个FIN分节。 
4) 主动关闭端(active close)接受到这个FIN后,TCP对它进行确认。(TCP发送ACK分节,值得注意的是主动关闭端在未接受到FIN之前,它的状态就是TIME_WAIT)。 

TIME_OUT状态的存在的意义 
从图中,很清晰的看到TIME_WAIT状态发生在了active close 端,产生的时间点是发送ACK K+1 分节之后,原因是防止ACK分节在网络中丢失(lost),此时passive close进入LAST_ACK状态,意为等待ACK分节,如果此时ACK分节真的丢失了(passive close端的LAST_ACK超时),那么passive close端将会再次发送一个FIN K分节给对端。这就是为什么在图中,出现两次FIN的分节。

对于基于TCP的HTTP协议,关闭TCP连接的是Server端,这样,Server端会进入TIME_WAIT状态,可 想而知,对于访 问量大的Web Server,会存在大量的TIME_WAIT状态,假如server一秒钟接收1000个请求,那么就会积压 240*1000=240,000个 TIME_WAIT的记录,维护这些状态给Server带来负担。当然现代操作系统都会用快速的查找算法来管理这些 TIME_WAIT,所以对于新的 TCP连接请求,判断是否hit中一个TIME_WAIT不会太费时间,但是有这么多状态要维护总是不好。

 

2.解决出现大量TIME_WAIT情况的方法

对/etc/sysctl.conf文件进行修改:

#对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃,不应该大于255,默认值是5,对应于180秒左右时间   
net.ipv4.tcp_syn_retries=2  
#net.ipv4.tcp_synack_retries=2  
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为300秒  
net.ipv4.tcp_keepalive_time=1200  
net.ipv4.tcp_orphan_retries=3  
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间  
net.ipv4.tcp_fin_timeout=30    
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。  
net.ipv4.tcp_max_syn_backlog = 4096  
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭  
net.ipv4.tcp_syncookies = 1  
  
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭  
net.ipv4.tcp_tw_reuse = 1  
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭  
net.ipv4.tcp_tw_recycle = 1  
  
##减少超时前的探测次数   
net.ipv4.tcp_keepalive_probes=5   
##优化网络设备接收队列   
net.core.netdev_max_backlog=3000   

 修改完之后,执行:

/sbin/sysctl -p

这样参数就能生效了。

上面修改的参数里面,最主要的是4个参数:

net.ipv4.tcp_tw_reuse  

net.ipv4.tcp_tw_recycle

net.ipv4.tcp_fin_timeout
net.ipv4.tcp_keepalive_*
一般情况下,修改这些基本上就够用了。

 

 

分享到:
评论

相关推荐

    CentOS解决服务器存在大量time_wait的问题

    近期服务器出现大量time_wait的TCP连接造成服务器连接数过多而最终导致tomcat假死状态。连接服务器查看连接数的时候提示如下。 [root@test apache-tomcat-7.0.53]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a...

    服务器大量TIME_WAIT解决方法

    linux 服务器大量TIME_WAIT解决方法

    windows 2008 R2解决socket连接不释放补丁包_time-wait过多注册表改.rar

    Windows Server 2008 R2系统BUG导致windows缓冲区已满(no buffer space),Windows核心套接字泄露问题导致操作系统套接字资源被耗尽,导致服务器与数据库无法正常对接。windows 2008 R2解决socket连接不释放补丁包_time...

    [线上问题] “服务端长连接与客户端短连接引起Nginx产生大量\"TIME_WAIT\"状态的线程”的问题分析解决

    NULL 博文链接:https://bert82503.iteye.com/blog/2147899

    测试解决TCP TIME-WAIT状态导致多链接失败问题.rar

    如果大量的 Time_wait 状态导致连接异常,有几种方法可以尝试解决问题。 减少 TIME_WAIT 超时时间:TIME_WAIT 状态是为了保证数据传输的完整性,因此在服务器端可以通过调整系统参数来减少 TIME_WAIT 超时时间。 ...

    TCP三次握手和四次挥手

    正常情况下一个服务器上不应该存在大量的`CLOST_WAIT`状态,如果大量存在大概率是代码的bug,关闭方法没有被执行到 2. `TIME_WAIT`:谁主动发起FIN,谁就进入该状态。起到的效果就是最后一次ACK提供重传的机会。表面...

    Linux高性能服务器编程

    3.2.3 使用tcpdump观察TCP头部信息 3.3 TCP连接的建立和关闭 3.3.1 使用tcpdump观察TCP连接的建立和关闭 3.3.2 半关闭状态 3.3.3 连接超时 3.4 TCP状态转移 3.4.1 TCP状态转移总图 3.4.2 TIME_WAIT状态 3.5...

    TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议

    4.2 客户的端口号和TIME_WAIT状态 4.3 设置TIME_WAIT状态的目的 4.4 TIME_WAIT状态的截断 4.5 利用TAO跳过三次握手 4.6 小结 第5章 T/TCP协议的实现:插口层 5.1 概述 5.2 常量 5.3 sosend函数 5.4 小结 第6章 T/TCP...

    mysql数据库my.cnf配置文件

    innodb_lock_wait_timeout = 120 # InnoDB事务在被回滚之前可以等待一个锁定的超时秒数。InnoDB在它自己的锁定表中自动检测事务死锁并且回滚事务。InnoDB用LOCK TABLES语句注意到锁定设置。默认值是50秒 bulk_insert...

    MySQL服务器性能优化.docx

    MySQL服务器性能优化全文共3页,当前为第1页。MySQL服务器性能优化全文共3页,当前为第1页。... (10)、wait_timeout: 服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800,我把它改为72

    IOCP原理及关键问题集(史上最全的IOCP资料大全).rar

    优雅的链接关闭方法及shutdown、TIME_WAIT 及注册表设置:TcpNumConnections/MaxUserPort 多核多线程、生产消费者模型、读写者模型、多线程无锁环形队列及LockFreeList概念 Socket重用、端口重用 心跳、粘包、乱序 ...

    IOCP常见问题集(史上最全的IOCP资料大全)

    优雅的链接关闭方法及shutdown、TIME_WAIT 及注册表设置:TcpNumConnections/MaxUserPort 多核多线程、生产消费者模型、读写者模型、多线程无锁环形队列及LockFreeList概念 Socket重用、端口重用 心跳、粘包、乱序 ...

    Python核心编程第二版(ok)

     7.9.1 方法(所有的集合方法)   7.9.2 方法(仅适用于可变集合)   7.9.3 操作符和内建方法比较   7.10 集合类型总结表   7.11 相关模块   7.12 练习   第8章 条件和循环   8.1 if语句  ...

    TCPIP(整合高清PDF版和分章节PDF版)

    这个目标的实现省略了连接开始时TCP的三次握手,并缩短了连接结束时TIME_WAIT状态的持续时间。我们将会看到,在客户-服务器事务中,T/TCP的性能与UDP相当,而且T/TCP具有可靠性和适应性,这两点相对UDP来说都是很大...

    ORACLE9i_优化设计与系统调整

    §5.1.4 调整以解决问题 83 §5.2 优化的执行者 84 §5.3 设置性能目标 84 第7章 系统优化方法 85 §6.1 何时优化效率最高 85 §6.1.1 系统设计阶段和开发阶段的优化 85 §6.1.2 改善产品系统的优化 85 §6.2 优化的...

    内存管理内存管理内存管理

    不过,即使是在这样一个简单的计算机中,您也会有问题,尤其是当您不知道程序的每个部分将需要多少内存时。如果您的空间有限,而内存需求是变化的,那么您需要一些方法来满足这些需求: 确定您是否有足够的内存...

    操作系统(内存管理)

    我们主要使用连接的指针遍历内存来寻找开放的内存块。这里是代码: 清单 6. 主分配程序 void *malloc(long numbytes) { /* Holds where we are looking in memory */ void *current_location; /* This is ...

    2009达内SQL学习笔记

    如果已有锁则自动退出:Select id,salary From s_emp where id=1 For Update NoWait; FOR UPDATE :可以再加 OF 精确到某格。如: ... For Update OF salary ... 注意要解锁。 五、ORDER BY 子句,排序 Order ...

    精通windows server 2008 命令行与powershell电子书PDF版(第一卷)

    7.5.1 connect ieproxy——代理服务器连接 328 7.5.2 connect iphost——到远程主机的连接 329 7.5.3 connect mail——到OE服务器的连接 329 7.5.4 connect news——设置OE新闻服务器TCP/IP连接 329 7.5.5 dump——...

    精通windows server 2008 命令行与powershell 电子书PDF版(第四卷)

    7.5.1 connect ieproxy——代理服务器连接 328 7.5.2 connect iphost——到远程主机的连接 329 7.5.3 connect mail——到OE服务器的连接 329 7.5.4 connect news——设置OE新闻服务器TCP/IP连接 329 7.5.5 dump——...

Global site tag (gtag.js) - Google Analytics