Ich habe viele Male über Linux's Token Bucket Filter (tbf) gelesen und verstehe immer noch nicht ganz, wie ich die burst
und latency
Parameter berechnen soll , schade um mich :(
Ich nehme an, dass eine angemessene Latenz etwa 50 ms beträgt. OK, aber welchen Wert sollte Burst annehmen?
Die Manpage sagt:
Die letztere Berechnung berücksichtigt die Größe des Eimers, die Rate und möglicherweise die Peakrate (falls festgelegt). Diese beiden Parameter schließen sich gegenseitig aus.
Wie hängt die Latenz mit Bucket und Filter zusammen? Gibt es eine Formel, um es zu berechnen? Oder geht es einfach darum, "OK, X Bytes Burst und Y Sekunden Latenz sind gut für mich"?
tbf
ist Teil des Linux Traffic Control Frameworks.man tbf
oderman tc-tbf
sollte Dokumentation bringen.Antworten:
Auf der Manpage besteht die einzige Einschränkung
burst
darin, dass sie hoch genug sein muss, um Ihre konfigurierte Rate zuzulassen: Sie muss mindestens Rate / Hz betragen. HZ ist ein Kernel-Konfigurationsparameter. Sie können herausfinden, was es auf Ihrem System ist, indem Sie Ihre Kernelkonfiguration überprüfen. Auf Debian können Sie beispielsweise:HZ auf meinem System ist also 250. Um eine Rate von 10 MBit
burst
/ s zu erreichen, würde ich daher eine Geschwindigkeit von mindestens 10.000.000 Bit / s ÷ 250 Hz = 40.000 Bit = 5000 Byte benötigen . (Beachten Sie, dass der höhere Wert in der Manpage stammt, wenn HZ = 100 die Standardeinstellung war.)Darüber hinaus
burst
ist aber auch ein politisches Instrument. Es konfiguriert das Ausmaß, in dem Sie jetzt weniger Bandbreite verwenden können, um es für die zukünftige Verwendung zu "speichern". Eine häufige Sache hierbei ist, dass Sie möglicherweise zulassen möchten, dass kleine Downloads (z. B. eine Webseite) sehr schnell ausgeführt werden, während Sie große Downloads drosseln. Sie tun dies, indemburst
Sie die Größe erhöhen , die Sie für einen kleinen Download halten. (Allerdings wechseln Sie häufig zu einer erstklassigen qdisc wie htb, damit Sie die verschiedenen Verkehrstypen segmentieren können.)Also: Sie konfigurieren den Burst so, dass er mindestens groß genug ist, um das gewünschte Ergebnis zu erzielen
rate
. Darüber hinaus können Sie es weiter erhöhen, je nachdem, was Sie erreichen möchten.Konzeptmodell eines Token-Bucket-Filters
Ein "Eimer" ist ein metaphorisches Objekt. Seine Schlüsseleigenschaften sind, dass es Token aufnehmen kann und dass die Anzahl der Token, die es aufnehmen kann, begrenzt ist. Wenn Sie versuchen, mehr hinzuzufügen, läuft es über und die zusätzlichen Token gehen verloren (genau wie der Versuch, zu viel Wasser in ein Token zu geben) tatsächlicher Eimer). Die Größe des Eimers wird aufgerufen
burst
.Um ein Paket tatsächlich in das Netzwerk zu übertragen, muss dieses Paket Token erhalten, die seiner Größe in Bytes oder
mpu
(je nachdem, welcher Wert größer ist) entsprechen.Es gibt (oder kann) eine Reihe (Warteschlange) von Paketen, die auf Token warten. Dies tritt auf, wenn der Bucket leer ist oder alternativ weniger Token als die Größe des Pakets hat. Auf dem Bürgersteig vor dem Eimer ist nur so viel Platz, und die Menge an Platz (in Bytes) wird direkt von festgelegt
limit
. Alternativ kann es indirekt mit eingestellt werdenlatency
(in einer idealen Welt wäre die Berechnungrate
×latency
).Wenn der Kernel ein Paket über die gefilterte Schnittstelle senden möchte, versucht er, das Paket am Ende der Zeile zu platzieren. Wenn auf dem Bürgersteig kein Platz ist, ist das für das Paket unglücklich, da sich am Ende des Bürgersteigs eine Grube ohne Boden befindet und der Kernel das Paket fallen lässt.
Das letzte Stück ist eine Token-Maschine , die addiert
rate
/HZ
Token , um den Eimer jede Zecke. (Aus diesem Grund muss Ihr Eimer mindestens so groß sein, da sonst einige der neu geprägten Token sofort weggeworfen werden.)quelle
rate
. Oder auch nicht, wie man einfach sagen könnte, der Eimer beginnt voll ...Eine weitere Antwort zur Ergänzung von Deroberts.
Erstens ist das Handbuch auf modernen Intel-CPUs veraltet. Moderne CPUs haben hochauflösende Timer, und modernes Linux ist weniger tick - was wörtlich bedeutet, dass es keine Timer-Ticks gibt. Daher sind all diese Kommentare, die Eimer groß genug machen, um die Token in einem Timer zu halten, irrelevant. Tatsächlich war die Bucket-Analogie nur dazu da, dem Benutzer zu helfen, die Wechselwirkung zwischen der Timer-Granularität und der Sendegeschwindigkeit zu verstehen. Jetzt, da Linux Nanosekunden-Timer auf moderner Hardware hat, verliert es seine Nützlichkeit.
Für TBF ist der Burst- Parameter die Anzahl der Bytes, die mit unbegrenzter Geschwindigkeit gesendet werden können, bevor die Ratenbegrenzung (angegeben durch die Rate ) einsetzt. Sobald die Ratenbegrenzung aktiviert ist, besteht die einzige Möglichkeit zum erneuten Burst darin, das Senden auf unter diese Rate zu beschränken .
Zum Beispiel kann sagen , Ihre tbf Burst Parameter 10K Bytes ist, und Ihre tbf Rate Parameter 2K Bytes / Sekunde, und Sie sind zur Zeit begrenzte Rate (dh die Burst erschöpft ist, so dass Sie bei 2kbps Sendung beschränkt sind). Wenn Sie die Geschwindigkeit, mit der Sie senden, freiwillig für 10 Sekunden auf 1 KBit / s reduzieren, würden Sie Ihre Burst-Toleranz von 10 KByte wieder zurückkumulieren (= (2000 [Bytes / Sek.] - 1000 [Bytes / Sek.]) * 10 Sek.). Wenn Sie es länger als 10 Sekunden unter 1 KBit / s halten, hat dies keine Auswirkung, da Sie mit tbf nicht mehr als den Burst- Parameter akkumulieren dürfen .
Wenn Sie die Ausgaben vollständig einstellen würden, würden Sie Ihre Burst-Zulage in 5 Sekunden wieder zurückerhalten (= 100000 [Bytes] / 2000 [Bytes / Sek.]).
Sie müssen nicht Ihre gesamte Burst-Erlaubnis zurückbekommen, um sie zu verwenden. Sie können so viel verwenden, wie Sie angesammelt haben.
Eine andere Sichtweise ist: Sie dürfen Burst- Bytes mit unbegrenzter Geschwindigkeit senden , danach kann Ihre langfristige Durchschnittsgeschwindigkeit die Rate nie überschreiten . Da es sich jedoch um einen langfristigen Durchschnitt handelt, dürfen Sie, wenn Sie die Rate unterschreiten , mit voller Geschwindigkeit aufholen - aber selbst dann dürfen Sie nur für höchstens Burst- Bytes voll senden (und wenn dies nicht der Fall ist) erlauben Sie aufzuholen, was Sie nicht können).
Die andere Falte ist, dass TBF zwei dieser Ratenbegrenzer hat und Ihr Datenverkehr beide durchlaufen muss. Im zweiten Fall heißt der Burst-Parameter mtu und, und die Rate heißt peakrate . Sie sollten diesen zweiten verwenden, um die Geschwindigkeit zu begrenzen, mit der der erste seine Bursts senden kann. Die Verwendung dieser zweiten Option ist optional. Wenn Sie sie nicht verwenden, werden die Bursts mit Gerätegeschwindigkeit gesendet.
Schließlich hat tbf einen Grenzwertparameter . Wenn das Programm dauerhaft schneller als die Rate sendet , werden Pakete in der Warteschlange aufgebaut. Es gibt keinen unendlichen Kernel-Speicher, daher gibt limit an , wie viele Bytes aufgebaut werden können, bevor der Kernel beginnt, Pakete zu verwerfen.
quelle