恢宏TIME_WAIT化解办法,应用代理

http://blog.csdn.net/guowake/article/details/6615728

发觉存在多量TIME_WAIT状态的连年
tcp        0      0 127.0.0.1:3306              127.0.0.1:41378         
  TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:41379         
  TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39352         
  TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39350         
  TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:35763         
  TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39372         
  TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39373         
  TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:41176         
  TIME_WAIT
 
经过调整基本参数解决
vi /etc/sysctl.conf

Linux下高并发socket最安卡拉接数所受的各个限制

编排文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
 
下一场实施/sbin/sysctl -p让参数生效。
 
net.ipv4.tcp_syncookies = 1表示开启SYN
Cookies。当现身SYN等待队列溢出时,启用cookies来处理,可预防少量SYN攻击,默许为0,表示关闭;

 

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

http://stackoverflow.com/questions/651665/how-many-socket-connections-possible

net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT
sockets的敏捷回收,暗许为0,表示关闭。

How many socket connections possible?

 

 http://www.cppblog.com/Solstice/archive/2011/06/02/147985.html

net.ipv4.tcp_fin_timeout修改系統默许的TIMEOUT时间
 
修改之后,再用命令查看TIME_WAIT连接数
netstat -ae|grep “TIME_WAIT” |wc –l

Muduo 互连网编制程序示例之十:socks4a 代理服务器

http://www.cnblogs.com/Solstice/archive/2011/04/27/2029904.html

  发现大批量的TIME_WAIT
已不存在,mysql进度的占用率极快就降下来的,网站访问平常。
 不过很多时候,出现大批量的TIME_WAIT状态的连天,往往是因为网站程序代码中尚无行使mysql.colse(),才导致大批量的mysql 
TIME_WAIT.
 
  如若您的服务器是Windows平台,可以修改上边的挂号表键值:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
“TcpTimedWaitDelay”=dword:0000001e

Muduo 网络编制程序示例之六:限战胜务器的最大并发连接数

 socket server file descriptors limit

 

 

TCP has a feature called “TIME_WAIT” that ensures connections are
closed cleanly. It requires one end of the connection to stay listening
for a while after the socket has been closed.

In a high-performance server, it’s important that it’s the clients who
go into TIME_WAIT, not the server. Clients can afford to have a port
open, whereas a busy server can rapidly run out of ports or have too
many open FDs.

To achieve this, the server should never close the connection first —
it should always wait for the client to close it.

 

TIME_WAIT is a TCP state and doesn’t consume file descriptors persay.
However the sockets in TIME_WAIT will consume file descriptors. A
socket is a file like just about everything else in unix. If this is
Linux you can tune the expire time of sockets (how long they are in time
wait) as well as enable socket recycling in /proc/sys/net/ipv4/.

Two items of particular interest are probably:

sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1

As always, test these beforehand if you can.

 

http://bbs.csdn.net/topics/290048302

用完了端口+AcceptEx+DisconnectEx+线程池+内部存款和储蓄器池写了2个http server, 
自作者用局域网的几台PC开300线程刷服务器,SOCKET由于过多的TIME_WAIT被耗尽,
接下来服务器成效大大下跌最终挂掉, 开50线程刷了2天没难题!

TIME_WAIT是TCP协议的一个必经状态,
网上说能够透过SO_LINGER选项让socket不经过TIME_WAIT状态,可是笔者试了试不行!
哪个人有化解TIME_WAIT难点的阅历,分享一下,多谢!

http://blog.csdn.net/Solstice/article/details/6527585

 

 

此值是TIME_WAIT状态的最长日子。缺省为240秒,最低为30秒,最高为300秒。提出为30秒。
 
注释:

1,TCP停止的长河如下:

互连网编制程序:优雅关闭socket/TIME_WAIT/CLOSE_WAIT/SoLinger

前言:平日检查Apache的连接数,同样会发觉许多无效的Time_Wait连接。有人说那是常规的,是因为二个呼吁中途抛锚造成的;还有人说 微软的IE连接时产生的Time_wait会比用Firefox连接时多。个人觉得有一定的Time_wait是平常的,

只要当先了连接数 的百分比就不是很正规,所以依然找来方法消除一下。

  

   检查net.ipv4.tcp_tw当前值,将日前的值更改为1秒钟:
[root@aaa1 ~]# sysctl -a|grep  net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
[root@aaa1 ~]#

vi /etc/sysctl
追加或涂改net.ipv4.tcp_tw值:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

使基础参数生效:
[root@aaa1 ~]# sysctl -p

[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse  = 1
net.ipv4.tcp_tw_recycle  = 1

安装那五个参数: reuse 是意味着是不是同意再次行使处于TIME-WAIT状态的socket用于新的TCP连接; recyse 是加速TIME-WAIT
sockets回收

用netstat再观望常常
此处化解难点的关键 是如何能够再一次利用time_wait的值,大家得以设置时检查一下time和wait的值
#sysctl -a | grep time | grep wait
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

后天检讨了一晃为主一台服务器,发现TIME_WAIT高到3k多(寻常一千-两千不曾难题). TIME_WAIT本人并不会占有非常大财富的,除非受到攻击.但太多服务器依然有或许挂掉.
TIME_WAIT 3699
CLOSE_WAIT 52
FIN_WAIT1 32
SYN_SENT 1
FIN_WAIT2 2
ESTABLISHED 17
SYN_RECV 45
CLOSING 6

根据《TCP/IP详解》 中的TCP的确立和终止中有关”TCP的停下”的教师

TCP的平息通过两岸的五遍握手达成。发起终止的一方执行积极关闭,响应的另一方执行被动关闭。

1.
发起方更改状态为FIN_WAIT_1,关闭应用程序 进度,发出二个TCP的FIN段;
2.
接收方收到FIN段,再次回到一个带确认序号的ACK,同时向自身相应的进程发送二个文件 停止符EOF,同时改变状态为CLOSE_WAIT,发起方接到ACK后意况更改为FIN_WAIT_2;
3.
接收方关闭应用程序进程,更改状态为LAST_ACK,并向对方发生3个TCP的FIN段;
4.
发起方接到FIN后情况更改为TIME_WAIT,并发生这一个FIN的ACK确认。ACK发送成功后(2MSL内)双方TCP状态变为CLOSED。

大家简单看出上边的呈现的结果的意趣。依据TCP协议,主动发起关闭的一方,会进去TIME_WAIT状态(TCP达成必须可信地甘休连接的五个趋势(全双工关闭)),持续2*MSL(Max
Segment Lifetime),缺省为240秒.

为什么 TIME_WAIT 状态供给保险 2MSL 这么长的年月?

TIME_WAIT 的等候时间为2MSL,即最大段生存时间.要是 TIME_WAIT
状态保持时间相差够长(比如小于2MSL),第三个延续就像常终止了。第二个具有同样相关五元组的连天出现(因为三番五次终止前发起的一方大概要求重发
ACK,所以停留在这场所包车型大巴时间必须为MSL的2倍。),而首先个一而再的再次报文到达,困扰了第1个接二连三。TCP达成必须预防某些连接的重新报文在连接终
止后出现,所以让TIME_WAIT态保持时间丰富长(2MSL),连接相应方向上的TCP报文要么完全响应完结,要么被舍弃。建立第二个一而再的时候,不
会混淆。

注:MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每一种具体的TCP实现都不能不选取贰个规定的MSL
值。翼虎FC 1122建议是2分钟,但BSD守旧达成选用了30秒。TIME_WAIT
状态最大保险时间是2 * MSL,也就是1-4分钟。

对apache的操作 
HTTP
协议1.1版规定default行为是Keep-Alive,也正是会引用TCP连接传输八个request/response.所以笔者打开http中的
keepalive
On,发现TIME_WAIT就及时少了下来.只有300的样子.总结一下.自作者觉得有二个原因.

1.keepalive不曾开,导致每便请求都要确立新的tcp连接,请求实现之后关闭,扩张了诸多time_wait的图景,没有引用,KeepAlive我认为它指的是涵养三番五次活跃,类似于Mysql 的永远连接。若是将KeepAlive设置为On,那么源于同一客户端的伸手就不必要再二遍一连,制止每一回请求都要新建2个接二连三而深化服务器的担当。
2.然后keepalive在系统 中作者的值很高.暗中认可空闲连接
7200 秒(2 小时)内尚未活动.才会断开.

我们开启KeepAlive :

KeepAlive On
MaxKeepAliveRequests 120
KeepAliveTimeout 15

如此各类连接能够发送九十一次呼吁,超时时间为15秒(如果首次呼吁和第3回呼吁之间超过KeepAliveTimeOut的年月以来,第③遍接二连三就会半涂而废,再新建第①个一而再)。

有关内核级别的keepalive和time_wait的优化调整

vi /etc/sysctl

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_fin_timeout = 30
net.core.netdev_max_backlog =8096

修改完记的使用sysctl -p 让它生效

如上参数的评释
/proc/sys/net/ipv4/tcp_tw_reuse
该文件表示是还是不是同意再度利用处于TIME-WAIT状态的socket用于新的TCP连接。

/proc/sys/net/ipv4/tcp_tw_recycle
recyse是加速TIME-WAIT sockets回收

对 tcp_tw_reuse和tcp_tw_recycle的修改,大概会出现.warning, got
duplicate tcp line warning, got BOGUS tcp
line.上边那3个参数指的是存在那五个完全相同的TCP连接,那会发生在2个接连被高效的断开并且重新连接的情形,而且使用的端口和地方一样。但基本
上这么的事务不会生出,无论怎样,使能上述设置会追加重现机会。这几个提醒不会有人和危机,而且也不会下落系统天性,最近正值开始展览工作

/proc/sys/net/ipv4/tcp_keepalive_time
代表当keepalive起用的时候,TCP发送keepalive新闻的频度。缺省是2钟头

/proc/sys/net/ipv4/tcp_fin_timeout   最棒值和BSD一样为30
fin_wait1状态是在倡导端主动要求关门tcp连接,并且主动发送fin今后,等待接收端回复ack时候的场馆。对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方也许会断开连接或直接不了事一连或不足预料的进度谢世。

/proc/sys/net/core/netdev_max_backlog
该文件钦点了,在接口接收数据包的速率比内核处理那几个包的速率快时,允许送到行列的数据包的最大数目

 

tcp tunnel proxy

http://www.partow.net/programming/tcpproxy/index.html
http://www.quietsche-entchen.de/cgi-bin/wiki.cgi/proxies/TcpProxy

http://tcpproxy.codeplex.com/

database proxy
http://code.google.com/p/amoeba/

Server                            Client

————– FIN ————–>  server: fin_wait_1

<————- ACK ————— client: close_wait 
server:fin_wait_2

<————- FIN  ————— client发出fin之后就倒闭

————– ACK ————->  server发出ack后进入time_wait状态

Time_Wait的默许时间是2倍的MLS,就是240分钟。MLS是TCP片在网上的最长存活时间。
TIME_Wait的重庆大学功用是确认保证关闭的TCP端口不及时被选拔。因为当互连网存在延迟时,只怕当有个别端口被关闭后,互连网中还有局地重传的TCP片在发向这些端口,如若那些端口立时创建新的TCP连接,则也许会有震慑。所以使用2倍的MSL时间来限制那么些端口登时被选用。

今昔的题材在于,4分钟的时日有点长。
因此,Time_wait的影响,作者想,首先每一个TCP连接都各自有个数据结构,叫TCP
Control
Block.Time_wait的时候这些数据结构没有被放飞。所以当有太多的TCP连接时,内部存储器或许会被挤占很多。

图片 1