Begrenzung der Schnittstellenbandbreite mit tc unter Linux

8

Ich habe einen Linux-Router mit einer 10-GBe-Schnittstelle an der Außenseite und verbundenen Gigabit-Ethernet-Schnittstellen an der Innenseite.

Wir haben derzeit ein Budget von 2 GBit / s. Wenn wir diese Rate einen Monat lang um durchschnittlich mehr als 5% überschreiten, wird uns die gesamte Kapazität von 10 Gbit / s in Rechnung gestellt. In Dollar ausgedrückt ein ziemlicher Schritt nach oben.

Daher möchte ich dies auf 2 GBit / s auf der 10 GBe-Schnittstelle beschränken.

Der TBF-Filter ist möglicherweise ideal, aber dieser Kommentar gibt Anlass zur Sorge.

Auf allen Plattformen außer Alpha ist es möglich, bis zu 1 MBit / s normalen Datenverkehrs mit idealer minimaler Burstigkeit zu formen und Daten genau mit den konfigurierten Raten zu senden.

Sollte ich TBF oder einen anderen Filter verwenden, um diese Rate auf die Schnittstelle anzuwenden, und wie würde ich das tun? Ich verstehe das hier gegebene Beispiel nicht: Traffic Control HOWTO

Insbesondere "Beispiel 9. Erstellen einer TBF mit 256 kbit / s"

tc qdisc add dev eth0 handle 1:0 root dsmark indices 1 default_index 0
tc qdisc add dev eth0 handle 2:0 parent 1:0 tbf burst 20480 limit 20480 mtu 1514 rate 32000bps

Wie wird die 256K Bit / s Rate berechnet? In diesem Beispiel sind 32000 Bit / s = 32 KByte pro Sekunde. Da tc bps = Bytes pro Sekunde verwendet. Ich denke, Burst und Limit kommen ins Spiel, aber wie würden Sie vorgehen, um vernünftige Zahlen zu wählen, um die gewünschte Rate zu erreichen?

Dies ist kein Fehler. Ich habe dies getestet und es gab eine Rate nahe 256K, aber nicht genau das.


BEARBEITEN

Nachdem ich viel gelesen und getestet habe, bin ich zu dem Schluss gekommen, dass TBF aufgrund der Bandbreite unangemessen ist. Unabhängig von den Einstellungen, die ich ausprobiert habe, konnte TBF keine Bandbreite> ~ 50 Mbit / s bereitstellen. Laut lartc.org/lartc.pdf ist die RED-Methode besser für die Gestaltung von Bandbreiten> 100 Mbit / s geeignet, daher werde ich versuchen, diese zu verwenden.

Wählen Sie jedoch den Wert a für min (dh die durchschnittliche Warteschlangengröße, bei der eine Markierung möglich wird). Das angegebene Beispiel lautet:

Sie sollten die min einstellen, indem Sie die höchste akzeptable Wartezeit für die Basiswarteschlange berechnen und mit Ihrer Bandbreite multiplizieren. Beispielsweise möchte ich auf meiner 64-kbit / s-ISDN-Verbindung möglicherweise eine Wartezeit für die Basiswarteschlange von 200 ms, sodass ich min auf 1600 Byte einstelle.

  1. Wie würden Sie die höchste akzeptable Wartezeit für die Basiswarteschlange wählen? Das Beispiel ist für 64 kbit / s.

  2. Was wäre für 2 Gbit / s akzeptabel?

Matt
quelle

Antworten:

2
  1. Sie sollten eine akzeptable Warteschlangenlatenz basierend auf der Art des Datenverkehrs wählen.

    • Zum Beispiel ist für Sprachwarteschlangen von mehr als 200 ms bereits ein Problem.
    • Ein Puffer von 500 ms für FTP / Torrent-Verkehr ist zwar überhaupt kein großes Problem.
  2. Warteschlangenlatenz / -strategie ist eine Frage des Verkehrstyps und nicht der Schnittstellengeschwindigkeit. Zum Beispiel sollte VOIP vielleicht überhaupt nicht in die Warteschlange gestellt werden. Leider ist die tc RED-Dokumentation nicht sehr klar. Lesen Sie besser einige RED-Informationen auf der Juniper / Cisco-Website und wenden Sie dieses Wissen auf tc an.

Alex_www
quelle
1

Wie wird die 256K Bit / s Rate berechnet? In diesem Beispiel sind 32.000 Bit / s = [32.000] Byte pro Sekunde.

Ja, die Mathematik dort ist richtig. Wenn Sie eine Zahl in der Nähe von 256 KB sehen, liegt diese wahrscheinlich etwas darunter. Woher messen Sie diese Zahl? Wenn Ihr Browser heruntergefahren ist oder ähnliches, wird der Overhead der Paket-Header nicht gezählt, sondern tcalles.

Jeff Ferland
quelle
Guter Punkt. Ich habe iperf benutzt.
Matt
1

Nach meiner Erfahrung kann qdisc TBF die Bandbreite problemlos auf 1 Gbit / s begrenzen, sodass ich davon ausgehen würde, dass sie auch auf 2 Gbit / s skaliert. Wahrscheinlich benötigen Sie jedoch eine echte CPU für den Job anstelle eines Low-End-Edge-Routers. So etwas wie 4 GHz i3 wird sicherlich ausreichen.

Versuchen Sie etwas wie

tc qdisc add dev "$DEV" root handle 1: \
  tbf rate "$UPLINK_RATE" burst "$UPLINK_BURST" latency "$TBF_LATENCY"

wo

DEV="$(ip route | grep "^default " | grep -Po "(?<=dev )[^ ]+")"
UPLINK_RATE="2000Mbit"
UPLINK_BURST="6500"
TBF_LATENCY="14ms"

Beachten Sie, dass Sie zur Verwendung von TBF mit geringer Latenz möglicherweise den PREEMPT-Kernel (z. B. Ubuntu- linux-lowlatency-hwe-*Paket) ausführen müssen, da das System sonst möglicherweise nicht alle diese Pakete verarbeitet.

Siehe auch: https://networkengineering.stackexchange.com/a/54404/36597

Mikko Rantalainen
quelle
Vielen Dank. Ich habe diese Frage vergessen. Ich fand eine Antwort und hatte ein Skript, das es tat. Aber ich habe das Unternehmen verlassen und kann die Lösung jetzt nicht veröffentlichen. Allerdings glaube ich, dass ich TBF verwendet habe und der Router ein schneller xeon-Server war.
Matt