Domanda

Sto scrivendo un programma di test per un server. Nell'app di prova, provo a connettere un gran numero di client al server, ma dopo un po 'ottengo tutti i tipi di errori come questi:

Connection reset by peer: socket write error                   

o

java.net.SocketException: Connection reset                     

o

java.net.ConnectException: Connection refused: connect

Uso un nuovo socket per ogni client che mi connetto al server.

Qualcuno potrebbe illuminarmi di questo strano comportamento?

È stato utile?

Soluzione

Purtroppo non hai fornito molti dettagli sulla natura del tuo server. Suppongo che tu stia scrivendo un tipico server TCP. In questa risposta, non parlerò di dettagli specifici di Java.

Il breve consiglio è: inserire un ritardo tra le connessioni client. Senza di essa stai attivamente simulando un attacco DoS al tuo server.

Per il più lungo, leggi di seguito.

Di solito un server TCP crea solo 1 in ascolto chiamato chiamando (nella bella interfaccia C) int sockfd = socket (...) e passando il risultato ( sockfd nel nostro caso) a bind () e hear () . Dopo questi preparativi, il server chiamerebbe un accept () che riporterà il server in pigiama (se il socket è stato contrassegnato come blocco) e se un client dall'altra parte della Terra inizierà a chiamare un La funzione connect () , di accept () (sul lato server) con il supporto del kernel del sistema operativo creerà il socket connesso .

Il numero effettivo di possibili connessioni in sospeso è noto osservando la funzione hear () . hear () ha un parametro backlog che definisce il numero massimo di connessioni che il kernel del sistema operativo dovrebbe mettere in coda al socket (questa è sostanzialmente una somma di tutte le connessioni negli stati SYN_RCVD e ESTABLISHED ). Storicamente il valore raccomandato per arretrato negli anni '80 era qualcosa come 5 che è ovviamente miserabile ai nostri giorni. In FreeBSD 7.2, ad esempio, un limite rigido per backlog può essere indovinato digitando:

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

e in Fedora 10:

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

P.S.
Ci scusiamo per il mio terribile inglese.

Altri suggerimenti

Il tuo server web / app può servire solo un numero limitato di client alla volta.

Riceverai una connessione rifiutata / ripristinata quando viene raggiunto questo limite.

Spero che risponda alla tua domanda.

Saluti

Esistono limiti del sistema operativo e del server Web quanto veloci e quante connessioni è possibile avviare / accettare. Se si desidera eseguire test delle prestazioni sul server, provare Apache JMeter in quanto ha soluzioni a questi limiti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top