2团
Published on 2024-10-30 / 5 Visits
0
0

Connect系统调用分配偶数端口导致 F5 负载均衡失败的问题

1.前言

近期在某云上进行项目压测,预期建立20W的模拟长连接终端,项目方购置的SLB(基于F5实现)规格也是20W。在压测的过程中,发现连接数到10W以上就开始出现连接被拒绝的现象。SLB端的监控图如下(图中可知,连接数上限为10W左右):

223f30f945ed73fad2e2c1e0df00d8c.png

2. 分析

查看F5监控日志,发现F5的部分哈希通道数满了(表达可能不专业,云端人士反馈),根据他们的经验,可能是压测客户端的TCP连接端口均为偶数端口导致的。

压测客户端共4台,每台压测5W的TCP长连接。

端口范围:net.ipv4.ip_local_port_range = 1024 65535

经检查,压测客户端的连接端口均为偶数端口,具体如下所示:

1730251177754.png

检查代码,发现connenct函数并未指定偶数端口,按理说应该会用到奇偶端口。

网上查询发现原因如下:

518daa94ce55ea945d17a550ddc0021.png

根据上图可知,内核对端口的分配策略进行了一些优化。

/proc/sys/net/ipv4/ip_local_port_range指定了随机端口的分配下限low_bound以及分配上限high_bound。默认情况下,分配下限low_bound以及分配上限high_bound数值如下所示:

图片-kjcf.png

具体如下(压测客户端的net.ipv4.ip_local_port_range = 1024 65535,low_bound为1024):

  • 优先给bind调用分配与low_bound奇偶性不同的端口,也就是奇数端口;

  • 优先给connect调用分配与low_bound奇偶性相同的端口,也就是偶数端口。

3.解决

为了快速得到压测结果,暂定不对压测应用进行修改。

结合随机端口分配策略是依赖于net.ipv4.ip_local_port_range参数,因此调整压测机器的net.ipv4.ip_local_port_range参数,两台的low_bound设置为1025,两台的low_bound设置为1024。经过如此调整,在初期压测过程中,会同时创建奇偶端口,满足SLB的负载均衡策略。

4.根因

结合网上搜索内容,随机端口的分配策略,大概率是为了避免出现自连接现象,可参考下文:

记一次 Kotlin Ktor 库的 PR 提交记录(TCP 自连接)


Comment