HAProxy端口资源耗尽的解决办法

项目背景

系统使用HAProxy为mq和部分应用的负载均衡服务。近期,瞬时流量过大,导致出现连锁反应,HA开始波动。
HAProxy版本:1.6.3

问题分析


心跳检测大量失败,项目状态极不稳定。观察日志发现如下警告:

FD limit (65535) too low for maxconn=204800/maxsock=410295. Please raise 'ulimit-n' to 410295 or more to avoid any trouble.

初步确定是因为机器的端口资源耗尽,导致项目通信异常,而异常的出现,将流量又进行了放大,导致资源更加紧张,形成恶性循环。

解决办法

通过查阅资料,发现两种解决办法:

  • 升级HAProxy版本到1.7,利用linux内核的IP_BIND_ADDRESS_NO_PORT特性,变相提升连接数能力。但是需要升级内核到4.2。(需要停机维护)
  • 参考https://blog.csdn.net/libaineu2004/article/details/79147778,暂时增加源端口数量并重用等待端口。
    最终采取第二种办法解决问题:
解决方案
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

总结

  • 系统基础架构要保持升级,特别是重要的可能成为瓶颈的服务;
  • 负载方式多样化,利用好备用方案;
  • 完善服务降级方案。
posted @ 2020-10-29 13:41  好奇成传奇  阅读(796)  评论(0编辑  收藏  举报