GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Tc Qdisc und Iperf verstehen?

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.

Verwandte:Nautilus-Kontextmenüoption zum Erstellen einer neuen Datei?

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

Linux
  1. 2>&1 und Verständnis der Redewendungen anderer Shell-Skripte

  2. Verständnis von Puppet-Ressourcen, Manifesten, Modulen und Klassen mit Beispielen

  3. Linux – Unix-Berechtigungen und Dateitypen verstehen?

  4. Kommunikation zwischen Pam und Pam-aware Daemon verstehen?

  5. Gewusst wie:MTR – Netzwerkkonnektivität verstehen und Fehler beheben

Dateipfade verstehen und wie man sie unter Linux verwendet

Linux-Dateisysteme verstehen:ext4 und darüber hinaus

Verstehen des Unterschieds zwischen dem Befehl sudo und su unter Linux

Bash If Else und andere bedingte Anweisungen verstehen

CentOS / RHEL 7 :Grundlegendes zu Kexec und Kdump

Grundlegende Dateiberechtigungen und Eigentumsrechte in Linux verstehen