避免TCP端口耗尽优化

1.修改/etc/sysctl.conf中的参数

sysctl net.ipv4.ip_local_port_range="1025 65000"
open files                      (-n) 65535

2.复用处于TIME_WAIT的端口

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1(如果有client通过nat连接应用此处设为0)

#设为1,time_wait占用的sockek链接快速回收,对外的服务器不打开,使用NAT请求时间戳不一致可能会造成故障
#出现问题关闭tcp_tw_recycle选项,而不是timestamp,在tcp timestamp关闭的条件下,开启tcp_tw_recycle是不起作用的;而tcp timestamp可以独立开启并起作用
[root@iZ2ze0cnscbfbls4uyfd1qZ /proc/sys/net/ipv4]# cat tcp_tw_recycle 
0

#time_wait占用的sockek链接可以重复使用,前提是先要打开时间戳
[root@iZ2ze0cnscbfbls4uyfd1qZ /proc/sys/net/ipv4]# cat tcp_tw_reuse     
1

#打开时间戳,可以判断数据是老的还是新的,
[root@iZ2ze0cnscbfbls4uyfd1qZ /proc/sys/net/ipv4]# cat tcp_timestamps   
1

3.缩短TIME_WAIT时间

Linux系统默认MSL为60秒,也就是正常情况下,120秒后处于TIME_WAIT的端口(句柄)才会释放,可以将MSL的时间缩小,缩短端口的释放周期。

# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
# echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout(最大并发连接数:64K/(15*2)=2.1K)

4. 添加多个IP

即使尽可能多的使用系统提供的端口范围,但最多依然不超过65K。TCP Socket文件实在太多,可以通过扩展多个 IP 来解决。

5. 使用长连接

服务最好使用长连接,一是避免频繁的申请连接,导致端口耗尽;二是避免创建连接带来的时间消耗。

6、TIME_WAIT产生原因

a)nginx使用了短连接方式,可能会造成大量处于TIME_WAIT状态的连接

b)TCP/IP设计者本来是这么设计的,防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失);可靠的关闭TCP连接主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于CLOSED 状态,就会响应rst 而不是ack。所以主动方要处于 TIME_WAIT 状态,而不能是CLOSED

c)过多TIME_WAIT的解决方法

1
2
3
4
5
6
7
8
net.ipv4.tcp_syncookies = 1 //表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 //表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 //表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 //表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 //表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000 //表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 //表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 //表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息,默认为180000,改为5000。

对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

注意:生产中CLOSE_WAIT很多说明程序写的有问题。

参考:

http://noops.me/?p=252

http://noops.me/?p=269

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/2512.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注