Frage

Ich schreibe eine Client-Server-Anwendung BSD-Sockets verwenden. Es muss im Hintergrund läuft, kontinuierlich Daten zu übertragen, kann aber nicht die Bandbreite der Netzwerkschnittstelle aus dem normalen Gebrauch Schwein. In Abhängigkeit von der Geschwindigkeit der Schnittstelle, ich brauche diese Verbindung zu einer bestimmten max Übertragungsrate zu drosseln.

Was ist der beste Weg, dies zu erreichen, programmatisch?

War es hilfreich?

Lösung

Das Problem einer konstanten Menge von 1 Sekunde nach jeder Übertragung mit Schlaf ist, dass Sie abgehackt Netzwerk-Performance haben.

Lassen Sie BandwidthMaxThreshold die gewünschte Bandbreite Schwelle sein.

Lassen Sie TRANSFER die aktuelle Übertragungsrate der Verbindung sein.

Dann ...

Wenn Sie Ihren TRANSFER erkennen> BandwidthMaxThreshold dann tun Sie einen Sleeptime = 1 + Sleeptime * 1,02 (Erhöhung Schlafzeit um 2%)

Vor oder nach jedem Netzbetrieb tun ein Sleep (Sleeptime)

Wenn Sie erkennen Ihr TRANSFER viel niedriger als Sie ist BandwidthMaxThreshold Sie Ihre Sleeptime verringern. Alternativ könnten Sie einfach Zerfall / verringern Sie die Sleeptime im Laufe der Zeit immer. Schließlich Ihre Sleeptime wird wieder 0 erreichen.

Statt einer Steigerung von 2% könnten Sie auch um einen größeren Betrag eine Steigerung tun linear von der Differenz zwischen TRANSFER -. BandwidthMaxThreshold

Diese Lösung ist gut, weil Sie keine Betten haben werden, wenn das Netzwerk des Benutzers bereits nicht so hoch ist, wie Sie möchten.

Andere Tipps

Der beste Weg, ein Token-Bucket zu verwenden wäre.

nur übertragen, wenn Sie genügend Token haben, ein Paket zu füllen (1460 Byte würde eine gute Menge sein), oder wenn Sie die Seite erhalten, aus der Steckdose nur lesen, wenn Sie genug Token haben; ein bisschen einfache mathematische wird Ihnen sagen, wie lange müssen Sie warten, bis Sie genug Tokens haben, so dass Sie so viel Zeit schlafen kann (vorsichtig sein, wie viele Zeichen Sie gewonnen zu berechnen, wie viel Sie wirklich geschlafen, da die meisten Betriebssysteme Ihr Prozess länger schlafen können, als Sie gefragt).

Um die Größe der Bursts zu steuern, um die maximale Menge von Token begrenzen Sie haben können; eine gute Menge 1 Sekunde im Wert von Token sein könnte.

Ich habe viel Glück gehabt mit Rinnsal . Es ist cool, weil es beliebige User-Space-Anwendungen ohne Modifikation drosseln kann. Es wirkt durch seine eigene Sende- / recv Wrapper-Funktionen Vorbelastung, die für Sie die Bandbreite Berechnung tun.

Der größte Nachteil ich fand, war, dass es schwierig ist, mehrere Anwendungen zu koordinieren, die Sie endliche Bandbreite teilen möchten. „Getröpfelt“ hilft, aber ich fand es kompliziert.

Update im Jahr 2017: es sieht aus wie Rinnsal bewegt https://github.com/mariusae/trickle

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