最近用户的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_keepalive_*
相关推荐
本文主要探讨了如何解决CentOS服务器上存在的大量TIME_WAIT TCP连接问题,这可能导致服务器连接数过多,进而引起服务假死。当服务器之间的通信过于频繁,如通过REST请求互相调用时,Java服务器可能无法及时回收TCP...
本文将深入解析如何有效解决MySQL出现大量TIME_WAIT状态的问题,通过调整系统内核参数、优化数据库配置以及合理管理连接池策略,确保服务器性能的稳定与高效。 ### 一、理解TIME_WAIT TIME_WAIT是TCP协议中的一个...
"服务器大量TIME_WAIT解决方法" 在 Linux 服务器中,TIME_WAIT 状态是一种常见的网络连接状态。然而,出现大量的 TIME_WAIT 状态可能会对服务器的性能产生影响。本文将详细介绍大量 TIME_WAIT 状态的成因、影响和...
### 大量TIME_WAIT状态的连接解决方法 在Linux系统中,当服务器处理大量网络连接时,可能会遇到TIME_WAIT状态的连接过多导致的问题。TIME_WAIT是TCP连接的一个正常终止状态,但若数量过多则可能会影响到服务器性能...
当服务器出现大量TIME_WAIT连接时,这可能会导致性能下降,甚至影响服务的可用性。TIME_WAIT状态是TCP连接生命周期的一部分,用于确保数据传输的可靠性,但过多的TIME_WAIT连接会消耗系统资源,特别是端口资源。 ...
在 TCP 连接中,客户端和服务器端都可以处于不同的状态,例如 ESTABLISHED、CLOSE_WAIT、FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT 等 trạng thái。 CLOSE_WAIT 状态是 TCP 连接中的一种状态,它表示服务器端已经收到了...
本文讨论了在线上环境中,服务端长连接和客户端短连接配置不当导致Nginx服务器产生大量“TIME_WAIT”状态线程的问题,同时提供了问题的分析和解决方法。本文主要涉及的网络编程知识点包括长连接与短连接的定义和区别...
CLOSE_WAIT问题的解决需要确保服务器端正确关闭连接,以释放连接资源。同时,也需要注意编程的重要性,以避免CLOSE_WAIT状态的出现。 知识点: 1. CLOSE_WAIT状态的定义和产生原因 2. CLOSE_WAIT状态的解决方法 3....
然而,在高并发场景下,大量连接处于TIME_WAIT状态可能会导致系统资源(如端口)的浪费,从而影响服务器性能。 针对这一问题,可以通过调整Linux系统的内核参数来优化TIME_WAIT状态的处理,以下是一些具体的优化...
"解决TIME_WAIT过多造成的问题1" TIME_WAIT状态是TCP连接的四次挥手关闭...在高并发短连接的业务场景中,我们需要关注TIME_WAIT状态的影响,采用合理的方法来解决这个问题,例如使用负载均衡和优化服务器的资源分配。
以下是一些常见的解决TCP TIME_WAIT问题的方法: 1. **改用长连接**: 长连接可以减少连接的创建和销毁,从而降低TIME_WAIT的数量。然而,长连接可能导致服务器资源的过度消耗,尤其对于需要快速释放连接的动态...
TIME_WAIT状态带来的主要问题在于资源占用,尤其是在服务器端,大量并发连接进入TIME_WAIT可能导致端口耗尽,影响新连接的建立。解决这个问题的方法包括: 1. **调整TCP参数**:可以在操作系统层面修改TCP的超时...
在Linux服务器环境中,当TCP/IP连接关闭后,服务器端的...通过上述方法,可以有效地管理和减少Linux服务器上的TIME_WAIT状态连接,优化服务器性能,尤其是对于处理大量并发连接的服务器,如Squid,这些调整尤为重要。
解决TIME_WAIT过多的方法: 1. **优化应用代码**:确保应用程序正确处理连接关闭,及时关闭不再使用的socket。 2. **增大端口范围**:增加系统允许的最大TCP连接数,可以通过调整`net.ipv4.ip_local_port_range`来...
这个状态在处理网络连接时可能出现的问题时尤其重要。本文将深入探讨CLOSE_WAIT错误的含义、原因以及如何解决。 首先,理解TCP连接的生命周期至关重要。TCP连接由五种基本状态组成:CLOSED、LISTEN、SYN_SENT、SYN_...
TCP连接有多种状态,包括LISTEN、SYN_SENT、SYN_RECEIVED、ESTABLISHED、CLOSE_WAIT、FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT等。每个状态都代表了连接的不同生命周期阶段。Close_Wait是服务器端接收到客户端的FIN( ...
### Apache Time_Wait 连接数太多问题及解决方法 #### 一、问题背景 在运维Apache服务器的过程中,经常遇到的一个问题是与负载均衡器之间的连接数异常增多,并且这些连接状态大多处于`TIME_WAIT`状态。这种情况会...