Bandbreite eines Uploads begrenzen



  • Hallo,

    gibt es eine Möglichkeit die Bandbreite eines Uploads zu begrenzen. Ich habe gelesen das das mit sleep funktionieren könnte, dadurch die Verbindung aber sehr belastet würde.
    Die beste Lösung wäre wohl eine Übertragung per TokenBucket, finde da aber relativ wenig Informationen wie dies umzusetzen wäre.

    Schön wäre es noch, wenn dies per FTP funktionieren würde. Es gibt Seiten auf denen man angeblich Scripte käuflich erwerben kann, aber wenig Informationen darüber ob es auch so funktioniert.

    Ich würde so eine Art der Übertragung benötigen um parallel zu einem Spiel Daten langsam übertragen zu können die für Auswertungen benötigt werden.

    mfg Christian 'eXc'



  • Du beschreibst den Kontext überhaupt nicht. Gehts dir um dein Programm? Willst du ein Programm schreiben, dass die Bandbreite für ein fremdes Programm reguliert? Wenn ja, für welches Betriebssystem?
    Gehen tut auf jeden Fall alles.



  • Google mal nach Traffic Shaper



  • @eXc
    Wenn du nur möchtest dass dein Spiel "ungestört" läuft, dann kannst du das u.U. auch über das QoS Feature deines Routers regeln. Sofern der QoS kann. Router-Betriebssysteme wie dd-wrt können das normalerweise.



  • Also ich möchte mit einem Programm Daten, am liebsten zu einem FTP übertragen. Dieses Programm läuft wissentlich auf PCs von verschiedenen Benutzern.
    Da das Programm aber im Hintergrund laufen soll, müsste die Datenübertragung möglichst langsam geschehen um ein im Vordergrund laufendes Online-Spiel nicht zu beeinträchtigen.
    Das Programm läuft auf Windows-Systemen. Bei den Daten wird es sich um Bilder handeln, nicht groß aber schon ein paar.

    mfg Christian 'eXc'



  • Dann wartest du eben etwas zwischen den einzelnen Datenblöcken.

    Du musst nicht das ganze Bild mit einem send übertragen.



  • So ganz einfach ist das Thema nicht... In Windows gibts z.B. BITS, Background Intelligent Transfer Service oder so. Er nutzt die ganze Bandbreite, wenn sie verfügbar ist, drosselt aber, wenn andere die Bandbreite brauchen.
    Besser würde man es wahrscheinlich tatsächlich zentral regeln, also z.B. auf dem Router QoS einstellen. Ist aber Konfigurationsaufwand, das will man dann meistens doch nicht haben.



  • Wenn man das Spiel per QoS bevorzugt, hat das den Vorteil, dass man grundsätzlich so ziemlich alles nebenbei laufen lassen kann ohne das Spiel all zu schlimm auszubremsen.
    Und dass man QoS laufen hat sollte sich auch abseits vom Spielen positiv bemerkbar machen. z.B. dadurch dass man trotzdem normal weitersurfen kann während grosse Downloads von schnellen Servern laufen (ISOs etc.).



  • Das ist aber glaub ich nicht das was ich suche 😕 Ich möchte ja nichts auf dem Computer oder Router selber einstellen, sondern das Programm soll den Upload selber regeln.

    DirkB schrieb:

    Dann wartest du eben etwas zwischen den einzelnen Datenblöcken.

    Du musst nicht das ganze Bild mit einem send übertragen.

    Das wäre immo wohl die beste Alternative, wie könnte ich das denn umsetzen? Gibt es diesbezüglich eventuell Code-Beispiele?

    Mein letzter Ansatz war bis jetzt, den Upload auf dem FTP zu begrenzen, so dass alle Clients nur mit einer bestimmten Bandbreite uploaden können. Würde diese Lösung aber lieber Clientseitig lösen wollen.



  • Dann musst du den Upload Code selbst schreiben oder ein open source Programm entsprechend modifizieren.
    Bzw. kannst du natürlich auch gucken ob es sowas schon fertig gibt, also ein Programm das nen FTP Upload kann und eine Option zur Drosselung der Upload-Geschwindigkeit hat.

    robocopy hätte z.B. so ne Option:

    /IPG:n :: Inter-Packet Gap (ms), to free bandwidth on slow lines.
    

    Nicht dass robocopy jetzt FTP Uploads könnte, aber vielleicht findet man mit dem Suchbegriff "Inter Packet Gap" ja 'was passendes.

    Und...
    Falls du es selbst umsetzen bzw. ein open source Programm anpassen möchtest... die nötige Änderung ist relativ einfach. Irgendwo wird send() in einer Schleife aufgerufen um die Daten zu verschicken.
    Den Code in dieser Schleife musst du so anpassen dass
    a) send() mit einer relativ kleinen Puffergrösse aufgerufen wird. Ich würde sagen maximal 1400 Byte.
    b) Nach send() ne kleine Pause reinmachen. Unter Windows heisst die Funktion dafür Sleep und nimmt Millisekunden, auf anderen Systemen geht es anders ( usleep , ...).
    Und vermutlich noch...
    c) Vor dem Versenden der Daten (also unmittelbar vor dieser Schleife) die Option TCP_NODELAY für den Socket aktivieren. Ohne TCP_NODELAY würde das OS versuchen Send-Coalescing zu machen, was bei kleinen Puffergrössen das schöne handgestrickte Timing kaputt machen würde. Falls der Socket danach weiterverwendet wird würde ich TCP_NODELAY danach wieder deaktivieren.

    Wenn du dann noch reinfummelst dass man beide Werte (Puffergrösse und Delay) per Commandline übergeben kann, dann kannst du damit leicht rumexperimentieren. Also welche Werte ausreichend sind um das Spiel nicht mehr merkbar zu beeinflussen.



  • Danke, werde mich diesbezüglich mal schlau machen.



  • vllt ist netlimiter was für dich.
    also wäre die einfachste lösung falls dir das reicht


Log in to reply