Schaufelgröße in tbf

11

Ich habe viele Male über Linux's Token Bucket Filter (tbf) gelesen und verstehe immer noch nicht ganz, wie ich die burstund latencyParameter 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"?

sebelk
quelle
1
Für alle, die dies unklar finden: tbfist Teil des Linux Traffic Control Frameworks. man tbfoder man tc-tbfsollte Dokumentation bringen.
Derobert
1
Aus Ihrer Bearbeitung geht hervor, dass Sie konzeptionell eine Erklärung benötigen, was ein Token-Bucket-Filter ist. Ich werde meiner Antwort eine hinzufügen, sobald ich wieder vor einem Computer
stehe
Schließlich in der konzeptionellen Erklärung hinzugefügt
derobert

Antworten:

16

Auf der Manpage besteht die einzige Einschränkung burstdarin, 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:

$ egrep '^CONFIG_HZ_[0-9]+' /boot/config-`uname -r`
CONFIG_HZ_250=y

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 burstist 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, indem burstSie 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

Token Bucket Filter

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 werden latency(in einer idealen Welt wäre die Berechnung rate× 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/ HZToken , 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.)

derobert
quelle
Ich dachte, dass Burst das Gegenteil ist, dass Sie die Rate für einen Moment übertreffen lassen, die später durch eine niedrigere Rate kompensiert wurden, um die durchschnittliche Rate zu erreichen ...
sebelk
@sebelk Ich bin mir ohne RTFS nicht sicher, aber es würde zu demselben Ergebnis führen, außer in dem Fall, dass tbf zu einer Schnittstelle hinzugefügt wird, die derzeit über dem ausgeführt wird rate. Oder auch nicht, wie man einfach sagen könnte, der Eimer beginnt voll ...
derobert
@sebelk: Das stimmt auch. Nehmen wir an, wir haben einen Bucket von 1000 Bytes (Burst-Größe) und die Token-Rate beträgt 10 Bytes pro. zweite. Wenn also 100 Sekunden lang keine Pakete angekommen sind, wird der Eimer gefüllt. Dann werden die nächsten 1000 Bytes der ankommenden Pakete sofort übertragen, ohne in die Warteschlange gestellt zu werden. Ein Burst in der Datenrate, der über der Rate der Tokenerstellung liegen kann.
Bjarke Freund-Hansen
5

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.

Russell Stuart
quelle