TCP连接TIME-WAIT解决方案

问题根源:

为什么会产生time-wait?

当客户端与服务器之间进行四次断开时,当客户端接收
到服务器端发送过来的断开确认报文后,会发送最后一次
ACK报文,发送之后客户端会进入time-wait状态,这个过
成会持续一分钟,用来完成接收剩余所有从服务器端发送
过来的数据[由于网络延迟等原因导致数据延迟达到],
同时也可以确自己发送的最后一个ACK断开确认报文能被
服务器端收到!

time-wait状态的危害:

1 time-wait状态会占据一定量的内存资源,虽然很少但
是如果这种连接在一个繁忙的服务器中过于多的话,会额外消耗内存资源

2 time-wait状态会占据文件描述符,因为要通过网络和
web程序通信,需要监听套接字文件,这样不仅会占用端
口还会占用文件描述符,在高并发短连接的场景中,额外
致命,往往一个连接请求一个资源需要几秒中,但是time
-wait连接却要等待1分钟,这往往会迅速消耗端口和描述符资源
当达到设置的阀值时,新的TCP连接的建立将会受到影响

如何检测这种状态:

方法1:
netstat -tnl | awk ‘/^tcp/{print $6}‘ | uniq -c
可以设置周期性任务计划将这类数据追加至一个文件中
进行查看!

方法2:
使用zabbix自定义key time-wait connection
在agent端使用UserParameter= 来创建一个收集这个值
的命令定期传递给服务器端,在服务器端设置触发器来
监控这个值的正常范围

解决方案思路:

1 linux系统自身参数设置过小:
调整如下参数:

所有用户一共可以打开的文件数:
[[email protected]:35:11~]#sysctl -a|grep file-max
fs.file-max = 44348

单用户可打开的文件数:
[[email protected]:35:11~]#sysctl -a|grep file-max
fs.file-max = 44348

web服务器自身是否开放进程数过小:
可以调整最大并发访问值等参数

linux系统端口范围:
[[email protected]:44:32~]#sysctl -a | grep ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768    60999
可以选择开放1024端口之上的所有端口!
1024 ~ 65535

2 如果是因为软件开发原因导致可暂时设置如下参数:

net.ipv4.tcp_tw_recycle = 1
表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭

net.ipv4.tcp_tw_reuse = 1
表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_fin_timeout = 60
缩短系统设定的time-wait时间

net.ipv4.tcp_syncookies = 1
表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN***,默认为0,表示关闭;

先有效控制time-wait的数量然后在排查问题所在!

原文地址:http://blog.51cto.com/13878078/2322335

时间: 2024-08-03 21:24:26

TCP连接TIME-WAIT解决方案的相关文章

对TCP连接被重置解决方案的探究

分类: 网络与安全 对TCP连接被重置解决方案的探究——跨过GFW通向自由网络的可行途径 2010年05月25日 星期二 上午 00:19 这个标题有点长——其实开始只想写破折号之前的部分,因为这种技术文章说的隐晦一点没有坏处,但又担心大家不明白是怎么回事,硬着头皮还是补上了后面的部分. 中 国的网络环境很复杂,同时中国也是对互联网高度控制的国家之一,当然仅限于大陆.而控制中国网民自由上网的网络海关正是大名鼎鼎的GFW(Great Fire Wall,长城防火墙),GFW的工作原理就是重置TCP

服务器后台TCP连接存活问题

0. 背景 公司的服务器后台部署在某一个地方,接入的是用户的APP,而该地方的网络信号较差,导致了服务器后台在运行一段时间后用户无法接入,那边的同事反馈使用netstat查看系统,存在较多的TCP连接. 1. 问题分析 首先在公司内部测试服务器上部署,使用LoadRunner做压力测试,能正常运行,然后那边的同事反馈该地方信号较差.考虑到接入的问题,有可能接入进程的FD资源耗尽,导致accept失败.推论的依据是对于TCP连接来说,如果客户端那边由于一些异常情况导致断网而未能向服务器发起FIN关

通过UDP建立TCP连接

解释 通过UDP广播查询服务器的IP地址,然后再建立TCP点对点连接. 应用场景 在服务器IP未知时,并且已知服务器与客户端明确在一个局域网或者允许组播的子网下. 通过UDP发现服务器地址然后再进行TCP连接. (PS:万维网很多路由器对组播进行了限制,所以不能通过UDP报文在万维网上进行服务器查询) 主要问题 Android真机和模拟器对组播处理不同 Android不同系统版本对组播处理不同 不同网络对组播有限制,如部分路由网络限制UDP报文 简单实现 传统组播方式,通过255.255.255

如何在socket编程的Tcp连接中实现心跳协议

心跳包的发送,通常有两种技术 方法1:应用层自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户端的回应, 如果在一定时间内没有收到客户端的回应,即认为客户端已经掉线:同样,如果客户端在一定时间内没 有收到服务器的心跳包,则认为连接不可用. 方法2:TCP的KeepAlive保活机制 因为要考虑到一个服务器通常会连接多个客户端,因此由用户在应用层自己实现心

TCP连接的状态详解以及故障排查

转载自CSDN博客:http://blog.csdn.net/hguisu/article/details/38700899 TCP状态 TCP状态迁移路线图 TCP连接建立三次握手 TCP连接的终止四次握手释放 同时打开 同时关闭 TCP通信中服务器处理客户端意外断开 Linux错误信息errno列表 我们通过了解TCP各个状态,可以排除和定位网络或系统故障时大有帮助.(总结网络上的内容) 1.TCP状态 了解TCP之前,先了解几个命令:   linux查看tcp的状态命令: 1).netst

解决不对称流量经过JUNIPER防火墙,tcp连接重置丢失问题

背景:公司网络增加一台JUNIPER防火墙,用于外网网关使用,其实配置上网配置很简单,配置完成后,外网连接测试也都正常,但在特殊的测试环境中会出现一种情况,该环境如图所示: 现象:当PC机的网关指定为防火墙的内网接口后(而不是核心交换机地址),当pc在telnet或者ssh连接10.10.2.*网段的服务器(网关在核心交换机上)等时,tcp连接均会在20s后重置.我的环境中其实存在一些问题的,就是流经防火墙的流量并不对称,其中pc→服务器的流量经过防火墙,而服务器→pc的流量不经过防火墙,造成的

TCP连接状态及TIME_WAIT

参考: TCP连接中的TIME_WAIT状态 - sunnydogzhou的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/sunnydogzhou/article/details/6572071 TCP连接状态详解及TIME_WAIT过多的解决方法_小强_新浪博客 http://blog.sina.com.cn/s/blog_8e5d24890102w9yi.html TCP协议三次握手连接四次握手断开和DOS攻击 - NowOrNever - 博客频道 -

TCP连接检测机制

采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是我们需要的.我们希望服务器端和客户端都能及时有效地检测到连接失效,然后优雅地完成一些清理工作并把错误报告给用户. 客户端采用如下步骤: 1, 连接 2, 拔掉网线 经过以上两步: 从上图中可以看到,此时服务端的连接依然存在. 所以,tcp只是数据的发送与接收,包括握手,断开以及rst,time_wa

TCP 连接与TCP keep alive 保活检测机制

生产环境中一台2核4G的linux服务器TCP连接数时常保持在5-7w间徘徊,查看日志每秒的请求数也就100-200,怎么会产生这么大的TCP连接数.检查了下客户端上行的HTTP协议,Connection 头字段是Keep-Alive,并且客户端在请求完之后没有立即关闭连接.而服务端的设计也是根据客户端来的,客户端上行如果Connection:Keep-Alive,服务端是不会主动关闭连接的.在客户端与服务端交互比较频繁的时候,这样的设计还是比较合理的,可以减少TCP的重复握手.显然如果只交互一