kostenloser Webspace werbefrei: lima-city


Sockets werden nicht aufgeräumt

lima-cityForumProgrammiersprachenSonstige Programmiersprachen

  1. Autor dieses Themas

    g****e

    Wenn das hier der falsche Bereich ist, bitte verschieben. Ich fand keinen anderen sinnvoll.

    Ich habe folgendes Problem: Ich habe einen TCP-Echo Server geschrieben, in Rust, der wirklich nur echo macht. Nichts anderes. https://github.com/sateffen/rust-tcp-server
    Diesen wollte ich dann mit einem beiliegenden test.js Nodejs Script zubomben, mit 10.000 Verbindungen, um die Zeit zu messen. Eigentlich ganz einfach.
    Das erste mal funktioniert das auch, läuft durch, haupt 10k Verbindungen raus, alles gut. Das zweite mal bricht er mitten drin ab mit EADDRINUSE. Ok, das heißt für mich, meine Ports scheinen voll zu sein. Also gebe ich netstat -a ein, um zu sehen, was da alles für Verbindungen offen sind, und sehe, dass da tausende von Verbindungen mit dem Status "Wartend" stehen.
    Nun hab ich aber sowohl meinen Client, als auch den Server beendet, und es stehen immer noch tausende Verbindungen auf "wartend", es wurden also nicht alle abgeräumt. Das passiert erst nach einer Weile warten.
    Weil ich dachte, mein Rust Projekt ist vllt falsch (vllt hab ich ja doch ein Memory Leak erzeugt? Oder was vergessen?), habe ich einen Node Echo Server geschrieben (nicht commited), der einfach nur so aussieht:
    const net = require('net');
    net.createServer(socket => socket.pipe(socket)).listen(8888);

    Ist auch ein echo Server, und macht wirklich nichts anderes. Das interessante: Die Socket-Verbindungen werden auch hier im netstat -a über das Schließen beider Programme hinaus angezeigt.

    Jetzt weiß ich nicht mehr weiter, ob ich einen Fehler mache, oder ob Sockets von Windows sowieso erst später abgeräumt werden, auch wenn sie eigentlich bereits geschlossen werden? Ob netstat -a unter Windows vllt kaqqe anzeigt? Unter netstat -tanp taucht nie etwas auf, gar nicht, auch wenn die Programme laufen nicht.

    Vielleicht hat hier jemand Rat? Oder einen Hinweis?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich halte das nicht für einen Fehler.

    Der letzte Schritt des Verbindungsabbaus geht laut https://de.wikipedia.org/wiki/Transmission_Control_Protocol#/media/File:Tcp_verbindung.png immer über ein Timeout.

    Wenn Du es für Deinen zubomben-Test unbedingt ändern willst, dann könntest Du auf der Serverseite beim Verbindungsaufbau, eventuell irgendwie mit angeben, dass dieses Timeout kürzer sein soll.
    Vor vielen Jahren hatte ich mal ein ähnliches Problem, weiß jedoch nicht mehr genau, wie es gelöst wurde.

    Für den normalen Gebrauch, würde ich es jedoch so lassen wie es ist.
  4. Autor dieses Themas

    g****e

    Tatsächlich, das wusste ich gar nicht, dass ein Socket gar nicht sofort geschlossen wird.
    Also wird sendet der Client ein FIN Signal, und der Server wartet noch eine Weile, bis der Socket wirklich geschlossen wird. Für Windows hab ich den Wert von 240 Sekunden gefunden.
    Das heißt natürlich, dass wenn ich massiv viele Sockets öffne unter Windows, und diese dann in diesem time_wait zustand sind, irgendwann meine Slots voll sind. Das würde tatsächlich die Probleme erklären, und warum es Technologie-Unabhängig ist.

    In meiner Cloud9-VM habe ich dieses Problem übrigens nicht. Da habe ich keine Probleme, viele viele Verbindungen aufzubauen, solange es nicht zu viele gleichzeitig sind. 5k gehen aber auch hier (laut ulimit ~8k).

    Danke für den Link! Das hat mir sehr geholfen.
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!