Pergunta

Eu estou escrevendo um programa de teste para um servidor. No aplicativo de teste, eu tento conectar um grande número de clientes para o servidor, mas depois de um tempo a obter todos os tipos de erros como estes:

Connection reset by peer: socket write error                   

ou

java.net.SocketException: Connection reset                     

ou

java.net.ConnectException: Connection refused: connect

Eu uso um novo socket para cada cliente que se conectar ao servidor.

Alguém poderia me esclarecer sobre esse comportamento estranho?

Foi útil?

Solução

Infelizmente você não forneceu muitos detalhes da natureza do seu servidor. Eu suponho que você está escrevendo um servidor TCP típica. Nesta resposta eu vou não conversa sobre quaisquer detalhes específicos de Java.

O curto conselho é: inserir um atraso entre as conexões de clientes. Sem ela você está simulando ativamente um ataque DoS para o servidor.

Para o mais longo, leia abaixo.

Normalmente, um servidor TCP cria apenas 1 ouvindo golpeado pelo telefone (em linda interface de C) função int sockfd = socket(...), e passando o resultado (sockfd no nosso caso) para funções bind() e listen(). Após esta preparação, o servidor chamaria um accept() que íngreme o servidor no sono (se o soquete foi marcado como bloqueio) e se um cliente do outro lado da Terra vai começar a chamar uma função connect(), que accept() (no servidor lado) com o apoio do kernel do sistema operacional irá criar do socket conectado .

O número real de possível pendente connectins pode ser conhecido por olhar para a função listen(). listen() tem um backlog parâmetro que define o número máximo de conexão do OS do kernel deve fila para o socket (este é basicamente uma soma de todas as conexões em SYN_RCVD e ESTABLISHED estados). Historicamente, o valor recomendado para backlog em 1980 foi algo como 5, o que é obviamente infeliz em nossos dias. No FreeBSD 7.2, por exemplo, um limite rígido para backlog pode ser adivinhada, digitando:

% sysctl kern.ipc.somaxconn
kern.ipc.somaxconn: 128

e no Fedora 10:

% cat /proc/sys/net/core/somaxconn
128

P.S.
Desculpem a minha terrível Inglês.

Outras dicas

O seu servidor web / app só pode atender uma quantidade finita de clientes de cada vez.

Você receberá uma ligação recusada / reposto quando esse limite é atingido.

A esperança que responde a sua pergunta.

Felicidades

Existem OS e limites de webserver quão rápido e quantos conexão que você pode iniciar / aceitar. Se você quer fazer o teste de desempenho no servidor, tente Apache JMeter, pois tem soluções para esses limites.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top