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)

解决方案

 

参考: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来管理源端口

 

posted @ 2019-01-28 15:02  番茄土豆西红柿  阅读(1288)  评论(0)    收藏  举报
TOP