Ich versuche, die Bandbreite mit tc
zu begrenzen und überprüfen Sie die Ergebnisse mit 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 miteinander verbunden.
Ich habe dann ein htb
eingerichtet qdisc
mit einer Standardklasse, 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 bekomme nicht das, 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 verdoppele, ändert sich die gemessene Bandbreite nicht. Was vermisse ich? Warum entspricht die gemessene Bandbreite nicht den 1mbit aus der rate
Parameter? Welche Parameter muss ich einstellen, um die Bandbreite auf eine exakt vorgegebene Rate zu begrenzen?
Aber der man
Seite sagt, dass tbf
sollte die qdisc
sein Wahl für diese Aufgabe:
Der Token-Bucket-Filter eignet sich zum Verlangsamen des Datenverkehrs auf eine genau konfigurierte Rate. Skaliert gut auf große Bandbreiten.
tbf
erfordert Parameter rate
, burst
und (limit
| latency
). Also habe ich Folgendes versucht, ohne zu verstehen, wie burst
und (limit
| latency
) beeinflussen die verfügbare Bandbreite:
# 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 nicht viel, bis ich bemerkte, dass das Hinzufügen eines Werts für mtu
ändert die Dinge drastisch:
# 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 exakt vorgegebene Rate zu begrenzen?
Soll ich den htb
verwenden oder tbf
Warteschlangendisziplin dafür?
BEARBEITEN :
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 einem physischen Computer
/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 die iperf
Server hat eine andere Bandbreite berechnet:
[ 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 die iperf
Server hat eine andere Bandbreite berechnet:
[ 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 die iperf
Server hat eine andere Bandbreite berechnet:
[ 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 die iperf
Server hat eine andere Bandbreite berechnet:
[ 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
entferne (die passive Schnittstelle) von der Bindung.
Schlussfolgerung
Verkehrskontrolle auf einer Bond-Schnittstelle funktioniert nicht, oder zumindest nicht wie erwartet. Ich muss weiter nachforschen.
Als Workaround könnte man die Warteschlangen-Disziplinen hinzufügen direkt an die zur Bindung gehörenden Schnittstellen.
Akzeptierte Antwort:
Wenn Sie sich nicht sicher sind, wie tc funktioniert, können Sie tc trotzdem überwachen und sehen, 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 ändern und Sie benötigen auch grep und awk:
#!/bin/sh
INTERVAL=15
while sleep $INTERVAL
do
/usr/sbin/tc -s -d class show dev wlan0
uptime
more /proc/meminfo | grep MemFree | grep -v grep
echo cache-name num-active-objs total-objs obj-size
SKBUFF=`more /proc/slabinfo | grep skbuff | grep -v grep | awk
'{print $2} {print $3} {print $4}'`
echo skbuff_head_cache: $SKBUFF
done