1.前言
近期在某云上进行项目压测,预期建立20W的模拟长连接终端,项目方购置的SLB(基于F5实现)规格也是20W。在压测的过程中,发现连接数到10W以上就开始出现连接被拒绝的现象。SLB端的监控图如下(图中可知,连接数上限为10W左右):
2. 分析
查看F5监控日志,发现F5的部分哈希通道数满了(表达可能不专业,云端人士反馈),根据他们的经验,可能是压测客户端的TCP连接端口均为偶数端口导致的。
压测客户端共4台,每台压测5W的TCP长连接。
端口范围:net.ipv4.ip_local_port_range = 1024 65535
经检查,压测客户端的连接端口均为偶数端口,具体如下所示:
检查代码,发现connenct函数并未指定偶数端口,按理说应该会用到奇偶端口。
网上查询发现原因如下:
根据上图可知,内核对端口的分配策略进行了一些优化。
/proc/sys/net/ipv4/ip_local_port_range指定了随机端口的分配下限low_bound以及分配上限high_bound。默认情况下,分配下限low_bound以及分配上限high_bound数值如下所示:
具体如下(压测客户端的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.根因
结合网上搜索内容,随机端口的分配策略,大概率是为了避免出现自连接现象,可参考下文: