Estou executando um balanceador de carga HAProxy para um servidor WebSocket.
Se eu colocar um servidor backend
backend pieproxy
option http-keep-alive
timeout tunnel 0ms
balance leastconn
server s1 IP:3001
O HAproy pode lidar apenas com 28.000 conexões estabelecidas.
Consigo contornar isso e fazer mais conexões adicionando outro servidor.
backend pieproxy
option http-keep-alive
timeout tunnel 0ms
balance leastconn
server s1 IP:3001
server s2 IP:3001
Agora o HAproxy pode fazer o dobro desse número de conexões.
Quando reduzo o valor de
sysctl net.ipv4.ip_local_port_range
O HAproxy é capaz de fazer conexões máximas de até
number of backend server * ip_local_port_range
Por favor me ajude. Estou esquecendo de alguma coisa?
Como posso fazer com que um servidor backend atenda mais conexões que o valor de ip_local_port_range
TL;DR: o limite que você vê é inerente ao funcionamento do TCP.
Cada conexão TCP é definida por uma tupla única de (source_ip, source_port,destination_ip, destination_port), o que significa que não pode haver várias conexões com a mesma tupla ao mesmo tempo porque elas não podem ser claramente distinguidas. O destination_ip e o destination_port são constantes no seu caso, já que você tem um servidor de destino fixo. O source_ip é constante já que este é o endereço IP do seu sistema local onde o haproxy está sendo executado.
Portanto, a única variável é source_port e ela é retirada de ip_local_port_range.
O que significa que você não pode ter mais do que ip_local_port_range conexões paralelas para o mesmo ip de destino:porta do mesmo ip de origem. E ip_local_port_range é limitado pelo fato de que um número de porta é de apenas 16 bits (ou seja, máx. 65535).
Observe que "paralelo" não se refere apenas a conexões acontecendo ao mesmo tempo, pois também pode haver algum tempo antes que o mesmo source_ip possa ser reutilizado novamente - para mais informações, leia sobre o estado TIME_WAIT no TCP.
Algumas pessoas que executam um grande número de conexões tendem a definir vários endereços IP em seus balanceadores de carga para isso e declaram vários servidores apontando para o mesmo endereço com diferentes fontes. Outros trapaceiam e têm um único servidor com "source 0.0.0.0 usersrc clientip", mas eles têm uma regra "set-src" que permite escolher um endereço de um dos locais. Mas, como dito acima, você sempre estará limitado a aproximadamente 64k portas por endereço de origem, portanto, 64k conexões.
Note que se seus servidores suportam HTTP/2, você pode passar WebSocket sobre HTTP/2 como fluxos individuais. O limite usual de fluxos por conexão é 100, então você pode ter 64k conexões por servidor com 100 fluxos de websocket cada, portanto 6,4M fluxos de websocket. Essa pode ser uma solução que vale a pena considerar.