Pregunta

Estoy escribiendo un programa de prueba para un servidor. En la aplicación de prueba, trato de conectar una gran cantidad de clientes al servidor, pero después de un tiempo obtengo todo tipo de errores como estos:

Connection reset by peer: socket write error                   

o

java.net.SocketException: Connection reset                     

o

java.net.ConnectException: Connection refused: connect

Uso un nuevo socket para cada cliente que conecto al servidor.

¿Podría alguien aclararme sobre este extraño comportamiento?

¿Fue útil?

Solución

Desafortunadamente no ha proporcionado muchos detalles de la naturaleza de su servidor. Supongo que está escribiendo un servidor TCP típico. En esta respuesta, no hablaré sobre detalles específicos de Java.

El consejo corto es: inserte un retraso entre las conexiones de los clientes. Sin ella, está simulando activamente un ataque DoS a su servidor.

Para el más largo, lea a continuación.

Por lo general, un servidor TCP crea solo 1 escucha interceptado llamando (en una encantadora interfaz C) a la función int sockfd = socket (...) y pasando el resultado ( sockfd en nuestro caso) a las funciones bind () y listen () . Después de estos preparativos, el servidor llamará a un accept () que hará que el servidor quede dormido (si el socket se marcó como bloqueante) y si un cliente en el otro lado de la Tierra comenzará a llamar a un La función connect () , que accept () (en el lado del servidor) con el soporte del kernel del SO creará el socket conectado .

El número real de posibles conexiones pendientes puede conocerse mirando la función listen () . listen () tiene un parámetro backlog que define el número máximo de conexiones que el núcleo del sistema operativo debe poner en cola al socket (esto es básicamente una suma de todas las conexiones en SYN_RCVD y ESTABLISHED ). Históricamente, el valor recomendado para backlog en la década de 1980 era algo así como 5, que obviamente es miserable en nuestros días. En FreeBSD 7.2, por ejemplo, se puede adivinar un límite rígido para acumulación escribiendo:

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

y en Fedora 10:

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

P.S.
Perdón por mi terrible inglés.

Otros consejos

Su servidor web / de aplicaciones solo puede atender a una cantidad finita de clientes a la vez.

Recibirá una conexión rechazada / restablecida cuando se alcance este límite.

Espero que responda su pregunta.

Saludos

Hay un sistema operativo que limita la velocidad y la cantidad de conexiones que puede iniciar / aceptar. Si desea realizar pruebas de rendimiento en el servidor, pruebe Apache JMeter ya que tiene soluciones para estos límites.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top