短连接导致端口耗尽

 

场景回放

  • A机器的服务请求B机器的服务
  • 短连接请求,动态创建连接端口
  • A机器服务会主动关闭连接
  • 短时间内高并发请求
  • A机器的tcpssports被耗尽了
  • 大部分网络连接处time_wait状态

 

内核配置

net.ipv4.ip_local_port_range = 1024     65000
net.ipv4.ip_local_reserved_ports = 5710-5739,15710-15739

 

 

 

端口耗尽

  • 主动调用close()/shutdown()断开连接,收到对方确认后状态变为TIME_WAIT。
  • TCP协议TIME_WAIT状态会一直持续2MSL,TIME_WAIT有时间窗口,Linux默认是60秒
  • TIME_WAIT状态的连接占用的资源不会被内核释放
  • TIME_WAIT状态转换到CLOSE状态后资源才会真正被系统收回。

 

内核参数优化

客户端内核参数优化

#开启TCP连接中TIME-WAIT套接字的快速回收
net.ipv4.tcp_tw_recycle=1   

#开启重用,表示是否允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接 。
net.ipv4.tcp_tw_reuse=1     

#对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。
#对方可能会断开连接或一直不结束连接或不可预料的进程死亡。
net.ipv4.tcp_fin_timeout=5    

#TCP时间戳(会在TCP包头增加12个字节),以一种比重发超时更精确的方法(参考RFC 1323)
#来启用对RTT 的计算,为实现更好的性能应该启用这个选项。
net.ipv4.tcp_timestamps=1  

#收缩TIME_WAIT状态socket的回收时间窗口 
net.ipv4.tcp_tw_timeout=3   

 

 

 服务端内核参数优化

#定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。
sysctl net.core.somaxconn=1024  
        
#传输缓区长度大小
ifconfig eth0 txqueuelen 5000           
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local

#在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目 
sysctl net.core.netdev_max_backlog=2000 

#对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器出现过载,可以尝试增加这个数字。 
sysctl net.ipv4.tcp_max_syn_backlog=2048 
 

参考资料:

https://en.wikipedia.org/wiki/Transmission_Control_Protocol?spm=5176.100239.blogcont52884.5.JrKkjE

http://www.medianet.kent.edu/techreports/TR2005-07-22-tcp-EFSM.pdf

http://stackoverflow.com/questions/410616/increasing-the-maximum-number-of-tcp-ip-connections-in-linux/3923785#3923785

http://www.cnblogs.com/fczjuever/archive/2013/04/05/3000680.html

http://www.cnblogs.com/fczjuever/archive/2013/04/17/3026694.html

 

猜你喜欢

转载自woodding2008.iteye.com/blog/2336704