Frage

Ich bin writting test-Programm für einen server.In der test-app, ich versuche, Sie zu verbinden eine große Anzahl von clients mit dem server, aber nach einer Weile erhalten Sie alle Art von Fehler wie diese :

Connection reset by peer: socket write error                   

oder

java.net.SocketException: Connection reset                     

oder

java.net.ConnectException: Connection refused: connect

Ich benutze einen neuen socket für jeden client eine Verbindung zum server herstellen.

Könnte jemand mich aufklären über dieses seltsame Verhalten?

War es hilfreich?

Lösung

Leider haben Sie nicht zur Verfügung gestellt viele Details Ihres Servers Natur. Ich nehme an, Sie sind einen typischen TCP-Server zu schreiben. In dieser Antwort werde ich nicht über alle Java-spezifischen Details sprechen.

Die kurze Beratung ist: eine Verzögerung zwischen Clients Verbindungen einsetzen. Ohne es zu simulieren Sie aktiv einen DoS-Angriff auf den Server.

Für die längeren, lesen Sie unten.

Normalerweise wird ein TCP-Server erstellt nur 1 Hören socked durch (in schönen C-Schnittstelle) int sockfd = socket(...) Funktion aufrufen, und vorbei das Ergebnis (sockfd in unserem Fall) bind() und listen() Funktionen. Nach diesen Vorbereitungen, würde der Server ein accept() nennen, die den Server im Schlaf werden steil (wenn der Sockel als Blockierung markiert wurde), und wenn ein Client auf der anderen Seite der Erde beginnt eine connect() Funktion, als accept() Aufruf (auf dem Server Seite) mit der Unterstützung des OS-Kernel erstellen die angeschlossene Buchse .

Die tatsächliche Anzahl der möglichen anhängige Connectine kann, indem man die listen() Funktion bekannt sein. listen() hat eine Rückstand Parameter, der die maximale Anzahl der Verbindung definiert die OS-Kernel sollte an die Buchse Warteschlange (dies ist im Grunde eine Summe aller Verbindungen in SYN_RCVD und ESTABLISHED Staaten). Historisch gesehen der empfohlene Wert für Rückstand in den 1980er Jahren war so etwas wie 5, die in unseren Tagen offensichtlich unglücklich ist. In FreeBSD 7.2, zum Beispiel einer harte Grenze für Rückstand kann durch Eingabe erraten werden:

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

und in Fedora 10:

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

P. S.
Sorry für mein schreckliches Englisch.

Andere Tipps

Ihre Web / app-Server nur zu einem Zeitpunkt eine endliche Menge von Clients bedienen.

Sie erhalten eine Verbindung versagt / zurückgestellt, wenn diese Grenze erreicht wird.

Hoffnung, dass Ihre Frage beantwortet.

Prost

Es sind OS und webserver Grenzen, wie schnell und wie viele-Verbindung starten/annehmen.Wenn Sie wollen, um performance-Tests auf dem server, versuchen Sie, Apache JMeter, wie es Lösungen für diese Grenzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top