GNU/Linux >> Tutoriels Linux >  >> Linux

Comprendre Tc Qdisc et Iperf ?

J'essaie de limiter la bande passante avec tc et vérifier les résultats avec iperf . J'ai commencé comme ça :

# 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

Les deux instances sont directement connectées via Ethernet.

J'ai ensuite mis en place un htb qdisc avec une classe par défaut pour limiter la bande passante à 1 mbit/sec :

# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit

Mais je ne comprends pas ce que j'attendais :

# 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

Si je double le débit, la bande passante mesurée ne change pas. Qu'est-ce que je rate? Pourquoi la bande passante mesurée ne correspond-elle pas au 1 mbit du rate ? paramètre? Quels paramètres dois-je définir pour limiter la bande passante à un débit précis ?

Cependant, l'man la page dit que tbf devrait être le qdisc de choix pour cette tâche :

Le Token Bucket Filter est adapté pour ralentir le trafic à un taux configuré avec précision. S'adapte bien aux larges bandes passantes.

tbf nécessite des paramètres rate , burst et (limit | latency ). J'ai donc essayé ce qui suit sans comprendre comment burst et (limit | latency ) affectent la bande passante disponible :

# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k

Cela m'a donné une bande passante mesurée de 113 Kbits/sec. Jouer avec ces paramètres n'a pas beaucoup changé jusqu'à ce que je remarque que l'ajout d'une valeur pour mtu change radicalement les choses :

# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000

a entraîné une bande passante mesurée de 1,00 Mbits/s.

Quels paramètres devrais-je définir pour limiter la bande passante à un débit précis ?

Dois-je utiliser le htb ou tbf faire la queue pour la discipline ?

MODIFIER :

Sur la base de ces ressources, j'ai fait quelques tests :

  • https://help.ubuntu.com/community/UbuntuBonding
  • https://help.ubuntu.com/community/LinkAggregation
  • /usr/share/doc/ifenslave-2.6/README.Debian.gz http://lartc.org/

J'ai essayé les configurations suivantes.

Sur une machine physique

/etc/network/interfaces :

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
bridge_ports eth0

Mesure avec 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

Alors que le iperf serveur a calculé une bande passante différente :

[  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

Sur une machine virtuelle sans liaison

/etc/network/interfaces :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Mesure avec 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

Alors que le iperf serveur a calculé une bande passante différente :

[  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

Sur une machine virtuelle avec liaison (tc configuré sur eth0)

/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

Mesure avec 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

Alors que le iperf serveur a calculé une bande passante différente :

[  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

Sur une machine virtuelle avec liaison (tc configuré sur bond0)

/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

Mesure avec 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

Alors que le iperf serveur a calculé une bande passante différente :

[  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

Le résultat ne change pas si je supprime eth1 (l'interface passive) du lien.

Connexe :option de menu contextuel Nautilus pour créer un nouveau fichier ?

Conclusion

Contrôle du trafic sur une interface de liaison ne fonctionne pas, ou du moins pas comme prévu. Je vais devoir enquêter plus avant.

Comme solution de contournement, on pourrait ajouter les disciplines de mise en file d'attente directement aux interfaces appartenant au lien.

Réponse acceptée :

Lorsque vous n'êtes pas sûr du fonctionnement de tc, vous pouvez toujours surveiller tc et regarder comment les paquets circulent ? Vous pouvez utiliser mon script pour surveiller tc et devez l'exécuter dans un terminal avec des privilèges levés. Vous pouvez remplacer wlan0 par une autre interface et vous avez également besoin de grep et 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. Comprendre les commandes d'arrêt, de mise hors tension, d'arrêt et de redémarrage sous Linux

  2. 2>&1 et comprendre les autres idiomes du script shell

  3. Comprendre les commandes de contrôle des tâches sous Linux - bg, fg et CTRL + Z

  4. Comprendre la persistance des appareils et Oracle ASMLib

  5. Comprendre les autorisations UNIX et les types de fichiers

Comprendre les chemins de fichiers et comment les utiliser sous Linux

Comprendre les systèmes de fichiers Linux :ext4 et au-delà

Comprendre la différence entre les commandes sudo et su sous Linux

Comprendre Bash If Else et d'autres instructions conditionnelles

Comprendre les autorisations de fichiers de base et la propriété sous Linux

Comprendre /dev et ses sous-répertoires et fichiers