短连接导致端口耗尽
程序员文章站
2022-06-26 19:12:36
...
场景回放
- 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://*.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