Grundlegendes zu tc qdisc und iperf


15

Ich versuche, die Bandbreite mit zu begrenzen tcund 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 qdiscmit 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 rateParameter? Welche Parameter muss ich einstellen, um die Bandbreite auf eine genau festgelegte Rate zu begrenzen?

Auf der manSeite wird jedoch angegeben, dass tbfdies qdiscfü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.

tbfParameter erfordert rate, burstund ( limit| latency). Daher habe ich Folgendes versucht, ohne zu verstehen, wie burstund ( 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 mtudie 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 htboder die tbfWarteschlangendisziplin verwenden?

EDIT :

Basierend auf diesen Ressourcen habe ich einige Tests durchgeführt:

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 iperfServer 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 iperfServer 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 iperfServer 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 iperfServer 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 .


Seltsamerweise scheint dies für diesen Kerl funktioniert
Matías E. Fernández

1
Ich denke, mit htb muss man tc filterdie Pakete in Klassen einteilen . Möglicherweise müssen Sie auch einige der htb-Parameter ändern (stimmen Sie sie wie tbf ab). Ich schlage tcngvor, nachzusehen, was ein Frontend für tc ist. (Dies sind schnelle
Hinweise

In Ihrem Beitrag wurden keine Filter angezeigt. Welche Befehle verwenden Sie, um den Datenverkehr so ​​anzupassen, dass die Rate begrenzt werden kann?

Antworten:


2

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:

      #!/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

0

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 rateParameter gibt die durchschnittliche Rate an, die nicht überschritten werden darf, der Parameter burstoder limitgibt 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.


0

Führen Sie dies aus, bevor Sie die Warteschlangendisziplin für die Bonding-Schnittstelle hinzufügen (in diesem Fall bond0).

ipconfig bond0 txqueuelen 1000

Dies funktioniert nicht, da für virtuelle Softwaregeräte wie Bonding-Interfaces keine Standardwarteschlange vorhanden ist.


0

Da für bondGeräte keine Warteschlange definiert ist, wird qdiscdas Problem durch das Festlegen der Größe ausdrücklich behoben.

Hier ist ein Beispiel für ein Blatt qdisc, das unter HTBStruktur verwendet werden soll: tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.