Introdução
64k conexões IDLE concorrentes são amendoins para HAProxy e Erlang.
A primeira coisa a fazer é ativar a página de estatísticas no HAProxy . É obrigatório ter um monitoramento e ajuste de desempenho.
Então vamos entrar em limites.
O limite de conexão do SO
Só pode haver 1 conexão por tupla client_IP:client_PORT:server_IP:server_PORT
. Ele vem da maneira como as conexões são armazenadas e recuperadas no kernel (ou seja, hashtable). O mesmo no Linux e no Windows.
Eu terei que discordar do aseq sobre isso. NÃO é um limite teórico. É um limite muito prático, provavelmente atingido por qualquer pessoa que esteja fazendo testes de carga moderados.
Suponhamos que há três computadores na configuração atual:
[Test Computer] [HAProxy Computer] [Erlang Computer]
(front) test_IP:????<------>haproxy_IP:80
(back) haproxy_IP:????<------>erlang_IP:80
Todo o IP é fixo e a porta do servidor web é fixa. Isso deixa apenas uma porta como parâmetro variável, portanto, a quantidade máxima de conexões é limitada pela quantidade de portas disponíveis em qualquer computador. Há pouco espaço para a cabeça aqui (veja Intervalo de Portos Efêmeros). Você precisa obter mais instâncias, instâncias Erlang e instâncias de teste de carga.
Observação : observe que os usuários vêm de muitos IPs naturalmente, enquanto os testadores de carga (curl, Apache ab, JMeter) geralmente são executados em uma única caixa com um único IP (o JMeter e ferramentas semelhantes podem ser dimensionados usando escravos distribuídos).
Observação : conexões HAProxy estão sempre em pares (uma para o cliente + uma para o servidor interno). Tenha isso em mente, porque a maioria dos limites do sistema deve ser 2 * N para permitir N usuários.
Intervalo de Portas Efêmeras
Apenas algumas portas são usadas para criar novas conexões. Eles são chamados ephemeral ports
. O padrão do Linux é de 32768 a 61000.
Estenda o intervalo. Verifique primeiro se há algum serviço em execução usando-os em seus servidores.
sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 20000 65000
Esse ajuste só pode fornecer mais 60% de portas. Não será o suficiente para usar a web scale em um único servidor.
Porta de curta duração
Esteja ciente de que uma porta não pode ser reutilizada por um minuto inteiro depois de ser fechada (consulte Estados TCP), o que pode tornar o pool de portas bastante pequeno (por exemplo, 10k port / s qualquer pessoa?). Existem configurações de kernel para alterar a duração do fechamento e permitir a reutilização de portas de fechamento.
Você não precisará desses ajustes para conexões persistentes, na medida em que eles viverem o suficiente (alguns minutos antes de renovar pelo menos). É importante estar ciente do possível problema, no entanto.
HAProxy maxconn
Configure a configuração maxconn
no HAProxy. É a quantidade máxima de conexões abertas permitidas a qualquer momento.
Ele pode ser configurado em global
, por frontend
ou por backend
. A página de estatísticas mostra qual é a configuração ativa para cada um e tudo.
Ulimit do Linux
O ulimit é a quantidade máxima de arquivos abertos por um único processo (soquetes são arquivos no linux). O padrão do Linux está em algum lugar entre 1k e 10k.
O HAProxy configura automaticamente seu ulimit de processo com base no parâmetro maxconn
.
Você provavelmente precisará ajustar o ulimit manualmente para o processo Erlang.