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 schlage tcng
vor, nachzusehen, was ein Frontend für tc ist. (Dies sind schnelle