nginx - connect () falhou no upstream sob teste de carga

6

Eu tenho feito alguns testes de carga com wrk do meu proxy reverso nginx - > minha configuração de aplicativo da web e notei que, quando chego a mais de 1.000 conexões simultâneas, o nginx começa a retornar 502s e a seguinte mensagem de erro:

2015/04/17 20:45:26 [crit] 6068#0: *1116212677 connect() to \
127.0.0.1:3004 failed (99: Cannot assign requested address) \
while connecting to upstream, client: xxx.xxx.xx.165, server: \
foo.bar.com, request: "GET /my/route HTTP/1.1", upstream: \
"http://127.0.0.1:3004/my/route", host: "foo.bar.com"

o comando wrk foi:

wrk -t10 -c500 -d5m "https://foo.bar.com/my/route" -H "Accept: application/json"

Estou tentando descobrir o que pode ter dado errado aqui. Meu aplicativo da web está escutando solicitações intermediadas por nginx na porta 3004. O nginx está ficando sem portas? O aplicativo da Web não é capaz de lidar com essa solicitação? As solicitações estão expirando? Não estou claro sobre isso e gostaria de ter mais informações sobre isso.

    
por Alexandr Kurilin 17.04.2015 / 22:56

2 respostas

1

Já respondemos aqui: link

A mensagem sugere que você ficou sem sockets / portas locais.

Tente aumentar os limites de rede:

echo "10240 65535" > /proc/sys/net/ipv4/ip_local_port_range
sysctl net.ipv4.tcp_timestamps=1
sysctl net.ipv4.tcp_tw_recycle=0
sysctl net.ipv4.tcp_tw_reuse=1
sysctl net.ipv4.tcp_max_tw_buckets=10000

Como alternativa, você pode experimentar sockets unix para ver se isso ajuda.

    
por 17.11.2016 / 18:08
0

Visão geral dos sockets de rede Quando uma conexão é estabelecida via TCP, um soquete é criado no host local e remoto. O endereço IP remoto e a porta pertencem ao lado do servidor da conexão e devem ser determinados pelo cliente antes mesmo de iniciar a conexão. Na maioria dos casos, o cliente escolhe automaticamente qual endereço IP local usar para a conexão, mas às vezes é escolhido pelo software que estabelece a conexão. Finalmente, a porta local é selecionada aleatoriamente a partir de um intervalo definido disponibilizado pelo sistema operacional. A porta é associada ao cliente apenas pela duração da conexão e, portanto, é denominada efêmera. Quando a conexão é finalizada, a porta efêmera fica disponível para ser reutilizada.

Solução Ativando conexões keepalive

Use a diretiva keepalive para habilitar conexões keepalive do NGINX para servidores upstream, definindo o número máximo de conexões keepalive ociosas para servidores upstream que são preservadas no cache de cada processo de trabalho. Quando esse número é excedido, as conexões usadas menos recentemente são fechadas. Sem keepalives você está adicionando mais sobrecarga e sendo ineficiente com conexões e portas efêmeras.

http {
    upstream backend {
        server 10.0.0.100:1234;
        server 10.0.0.101:1234;
 }

    server {
        # ...
        location / {
            # ...
            proxy_pass http://backend;
            proxy_bind $split_ip;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
    }

    split_clients "$remote_addr$remote_port" $split_ip {
        10%  10.0.0.210;
        10%  10.0.0.211;
        10%  10.0.0.212;
        10%  10.0.0.213;
        10%  10.0.0.214;
        10%  10.0.0.215;
        10%  10.0.0.216;
        10%  10.0.0.217;
        10%  10.0.0.218;
        *    10.0.0.219;
    }
}

mais: link

    
por 11.04.2018 / 19:54