Ich versuche, die Bandbreite mit zu begrenzen tc
und die Ergebnisse mit zu überprüfen iperf
. Ich habe so angefangen:
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.7 port 35213 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 830 MBytes 696 Mbits/sec
Die beiden Instanzen sind direkt über Ethernet verbunden.
Ich habe dann eine htb
qdisc
mit einer Standardklasse eingerichtet, um die Bandbreite auf 1 MBit / s zu begrenzen:
# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit
Aber ich verstehe nicht was ich erwarte:
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.7 port 35217 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-12.8 sec 768 KBytes 491 Kbits/sec
Wenn ich die Rate verdopple, ändert sich die gemessene Bandbreite nicht. Was vermisse ich? Warum entspricht die gemessene Bandbreite nicht der 1 MBit vom rate
Parameter? Welche Parameter muss ich einstellen, um die Bandbreite auf eine genau festgelegte Rate zu begrenzen?
Auf der man
Seite wird jedoch angegeben, dass tbf
dies qdisc
für diese Aufgabe die erste Wahl sein sollte :
Der Token-Bucket-Filter ist geeignet, um den Datenverkehr auf eine genau konfigurierte Rate zu verlangsamen. Skaliert gut zu großen Bandbreiten.
tbf
Parameter erfordert rate
, burst
und ( limit
| latency
). Daher habe ich Folgendes versucht, ohne zu verstehen, wie burst
und ( limit
| latency
) sich auf die verfügbare Bandbreite auswirken:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k
Dies brachte mir eine gemessene Bandbreite von 113 Kbit / s. Das Herumspielen mit diesen Parametern änderte sich nicht so sehr, bis ich bemerkte, dass das Hinzufügen eines Wertes mtu
die Dinge drastisch ändert:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000
ergab eine gemessene Bandbreite von 1,00 Mbit / s.
Welche Parameter müsste ich einstellen, um die Bandbreite auf eine genau festgelegte Rate zu begrenzen?
Sollte ich dafür die htb
oder die tbf
Warteschlangendisziplin verwenden?
EDIT :
Basierend auf diesen Ressourcen habe ich einige Tests durchgeführt:
- https://help.ubuntu.com/community/UbuntuBonding
- https://help.ubuntu.com/community/LinkAggregation
- /usr/share/doc/ifenslave-2.6/README.Debian.gz http://lartc.org/
Ich habe die folgenden Setups ausprobiert.
Auf einer physischen Maschine
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
Messung mit iperf
:
# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.4 port 51804 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-11.9 sec 1.62 MBytes 1.14 Mbits/sec
Während der iperf
Server eine andere Bandbreite berechnet hat:
[ 4] local 192.168.2.1 port 5001 connected with 192.168.2.4 port 51804
[ 4] 0.0-13.7 sec 1.62 MBytes 993 Kbits/sec
Auf einer virtuellen Maschine ohne Bindung
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Messung mit iperf
:
# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.7 port 34347 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-11.3 sec 1.62 MBytes 1.21 Mbits/sec
Während der iperf
Server eine andere Bandbreite berechnet hat:
[ 4] local 192.168.2.1 port 5001 connected with 192.168.2.7 port 34347
[ 4] 0.0-14.0 sec 1.62 MBytes 972 Kbits/sec
Auf einer virtuellen Maschine mit Bonding (tc auf eth0 konfiguriert)
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
allow-bond0 eth0
iface eth0 inet manual
bond-master bond0
bond-primary eth0 eth1
auto eth1
allow-bond0 eth1
iface eth1 inet manual
bond-master bond0
bond-primary eth0 eth1
auto bond0
iface bond0 inet dhcp
bond-slaves none
bond-mode 1
# bond-arp-interval 250
# bond-arp-ip-target 192.168.2.1
# bond-arp-validate 3
Messung mit iperf
:
# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.9 port 49054 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-11.9 sec 1.62 MBytes 1.14 Mbits/sec
Während der iperf
Server eine andere Bandbreite berechnet hat:
[ 4] local 192.168.2.1 port 5001 connected with 192.168.2.9 port 49054
[ 4] 0.0-14.0 sec 1.62 MBytes 972 Kbits/sec
Auf einer virtuellen Maschine mit Bonding (tc auf bond0 konfiguriert)
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
allow-bond0 eth0
iface eth0 inet manual
bond-master bond0
bond-primary eth0 eth1
auto eth1
allow-bond0 eth1
iface eth1 inet manual
bond-master bond0
bond-primary eth0 eth1
auto bond0
iface bond0 inet dhcp
bond-slaves none
bond-mode 1
# bond-arp-interval 250
# bond-arp-ip-target 192.168.2.1
# bond-arp-validate 3
Messung mit iperf
:
# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.9 port 49055 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-13.3 sec 768 KBytes 475 Kbits/sec
Während der iperf
Server eine andere Bandbreite berechnet hat:
[ 4] local 192.168.2.1 port 5001 connected with 192.168.2.9 port 49055
[ 4] 0.0-14.1 sec 768 KBytes 446 Kbits/sec
Das Ergebnis ändert sich nicht, wenn ich eth1
(die passive Schnittstelle) von der Bindung entferne .
Fazit
Traffic Control auf einer Bond-Schnittstelle funktioniert nicht oder zumindest nicht wie erwartet. Ich werde weitere Nachforschungen anstellen müssen.
Als Problemumgehung könnte man die Warteschlangendisziplinen direkt zu den zur Anleihe gehörenden Schnittstellen hinzufügen .
tc filter
die Pakete in Klassen einteilen . Möglicherweise müssen Sie auch einige der htb-Parameter ändern (stimmen Sie sie wie tbf ab). Ich schlagetcng
vor, nachzusehen, was ein Frontend für tc ist. (Dies sind schnelleAntworten:
Wenn Sie sich nicht sicher sind, wie tc funktioniert, können Sie tc trotzdem überwachen und nachsehen, wie die Pakete fließen. Sie können mein Skript verwenden, um tc zu überwachen und müssen es in einem Terminal mit erhöhten Rechten ausführen. Sie können wlan0 auf eine andere Schnittstelle umstellen und benötigen außerdem grep und awk:
quelle
Erhöhen Sie die
burst
/limit
-Werte. Die Token-Bucket- Algorithmen lassen sich gut skalieren, weisen jedoch ein begrenztes Verhältnis von Genauigkeit und Geschwindigkeit auf.Die Genauigkeit wird durch die Verwendung eines kleinen Eimers erreicht, die Geschwindigkeit durch die Vergrößerung der Token. Große Token bedeuten, dass die Rate, mit der sie aufgefüllt werden, verringert wird (Token pro Sekunde = Bytes pro Sekunde / Bytes pro Token).
Der
rate
Parameter gibt die durchschnittliche Rate an, die nicht überschritten werden darf, der Parameterburst
oderlimit
gibt die Größe des Mittelungsfensters an. Da das Senden eines Pakets mit Leitungsgeschwindigkeit die festgelegte Rate für die Zeit überschreitet, in der das Paket übertragen wird, muss das Mittelungsfenster mindestens so groß sein, dass das Senden eines einzelnen Pakets nicht das gesamte Fenster über das Limit hinausschiebt. Wenn mehr Pakete in das Fenster passen, hat der Algorithmus eine bessere Chance, das Ziel genau zu treffen.quelle
Führen Sie dies aus, bevor Sie die Warteschlangendisziplin für die Bonding-Schnittstelle hinzufügen (in diesem Fall bond0).
Dies funktioniert nicht, da für virtuelle Softwaregeräte wie Bonding-Interfaces keine Standardwarteschlange vorhanden ist.
quelle
Da für
bond
Geräte keine Warteschlange definiert ist, wirdqdisc
das Problem durch das Festlegen der Größe ausdrücklich behoben.Hier ist ein Beispiel für ein Blatt
qdisc
, das unterHTB
Struktur verwendet werden soll:tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000
quelle