2 - Nginx/Haproxy端口耗尽导致整个机器所有服务受到影响
业务RD对abc.test.com域名压测,导致xx-nginx-xx此域名的转发端口耗尽,端口耗尽后导致xx nginx机器cpu占用增加从而影响其他服务的转发成功率。” 根据故障描述,根据故障描述,有两个技术要点需要分析:
-
端口耗尽如何造成影响
-
端口耗尽解决方案
技术分析
端口耗尽
-
TCP连接4元组:client_ip:client_port <-> server_ip:server_port
-
一般作为server端,server_ip和server_port是固定的
-
client_ip 大部分是固定的(如果本机配置多ip?)
-
client_port 可变,如果client_port被都被分配完的话,就会导致端口耗尽。
-
client_port
-
在linux系统中随机选择的端口范围由/proc/sys/net/ipv4/ip_local_port_range控制
-
client_port 范围:
1.在linux系统中随机选择的端口范围由/proc/sys/net/ipv4/ip_local_port_range控制
[@test01 ~]$ cat /proc/sys/net/ipv4/ip_local_port_range 10240 65000 #可用端口数量 = 65000 - 10240 = 54760
2.在linux系统中防止端口冲突情况,可以通过/proc/sys/net/ipv4/ip_local_reserved_ports预留端口
[root@fe02 ~]# cat /proc/sys/net/ipv4/ip_local_reserved_ports 80,100-999,8080 #保留地址在主动连接的时候不会被系统分配,如果手动指定源地址,不受限制。
3.被bind()绑定的端口不允许使用,无论是否开启reuse
4.被占用的端口无法使用,包含TIME_WAIT(linux默认这个状态时间为60s)
解决方案
-
增加源ip
-
4元组:client_ip:client_port <-> server_ip:server_port,client_ip增加,可用四元组会增加一倍
-
haproxy 中已经有类似的实现,参考:https://blog.csdn.net/libaineu2004/article/details/79147778、
-
-
快速释放或重用TIME_WAIT状态
-
tcp_tw_recycle
-
参考:haproxy TCP源端口耗尽问题(单个网卡最多65535个端口)
解决方案
1.增加本地端口范围
对于单一的dstIP:port,可用的源端口默认是28K左右,可以用如下命令查看当前值:
[haproxy ~]# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 61000
增加到64K个源端口
[haproxy ~]# vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1025 65000
2.允许处于TIME_WAIT状态的源端口重用
[haproxy ~]# vi /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
3.使用多个IP连接单一dstIP:port,并让haproxy来管理源端口

浙公网安备 33010602011771号