GNU/Linux >> Linux Esercitazione >  >> Linux

Capire Tc Qdisc e Iperf?

Sto cercando di limitare la larghezza di banda con tc e controlla i risultati con iperf . Ho iniziato così:

# 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

Le due istanze sono direttamente collegate tramite Ethernet.

Quindi ho impostato un htb qdisc con una classe predefinita per limitare la larghezza di banda a 1mbit/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

Ma non ottengo quello che mi aspetto:

# 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

Se raddoppio la velocità, la larghezza di banda misurata non cambia. Cosa mi sto perdendo? Perché la larghezza di banda misurata non corrisponde a 1mbit dal rate parametro? Quali parametri devo impostare per limitare la larghezza di banda a una determinata velocità?

Tuttavia, l'man la pagina dice che tbf dovrebbe essere il qdisc di scelta per questo compito:

Il Token Bucket Filter è adatto per rallentare il traffico a una velocità configurata con precisione. Si adatta bene a larghezze di banda elevate.

tbf richiede parametri rate , burst e (limit | latency ). Quindi ho provato quanto segue senza capire come burst e (limit | latency ) influiscono sulla larghezza di banda disponibile:

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

Questo mi ha portato a una larghezza di banda misurata di 113 Kbit/sec. Giocare con quei parametri non è cambiato molto finché non ho notato che l'aggiunta di un valore per mtu cambia le cose drasticamente:

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

ha prodotto una larghezza di banda misurata di 1,00 Mbit/sec.

Quali parametri dovrei impostare per limitare la larghezza di banda a una determinata velocità?

Dovrei usare il htb o tbf fare la fila per questo?

MODIFICA :

Sulla base di queste risorse, ho fatto dei test:

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

Ho provato le seguenti configurazioni.

Su una macchina fisica

/etc/network/interfaces :

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
bridge_ports eth0

Misurazione con 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

Mentre il iperf il server ha calcolato una larghezza di banda diversa:

[  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

Su una macchina virtuale senza collegamento

/etc/network/interfaces :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Misurazione con 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

Mentre il iperf il server ha calcolato una larghezza di banda diversa:

[  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

Su una macchina virtuale con Bonding (tc configurato su 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

Misurazione con 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

Mentre il iperf il server ha calcolato una larghezza di banda diversa:

[  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

Su una macchina virtuale con Bonding (tc configurato su 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

Misurazione con 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

Mentre il iperf il server ha calcolato una larghezza di banda diversa:

[  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

Il risultato non cambia se rimuovo eth1 (l'interfaccia passiva) dal legame.

Correlati:opzione del menu contestuale di Nautilus per creare un nuovo file?

Conclusione

Controllo del traffico su un'interfaccia bond non funziona, o almeno non come previsto. Dovrò indagare ulteriormente.

Come soluzione alternativa, è possibile aggiungere le discipline di accodamento direttamente alle interfacce appartenenti al legame.

Risposta accettata:

Quando non sei sicuro di come funziona tc puoi comunque monitorare tc e guardare come scorrono i pacchetti? Puoi usare il mio script per monitorare tc e devi eseguirlo in un terminale con privilegio revocato. Puoi cambiare wlan0 in un'altra interfaccia e hai anche bisogno di grep e 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. Comprendere i comandi di spegnimento, spegnimento, arresto e riavvio in Linux

  2. Come installare e utilizzare il comando fping su Linux

  3. 2>&1 e la comprensione di altri modi di dire di script di shell

  4. Comprendere i comandi di controllo del lavoro in Linux:bg, fg e CTRL+Z

  5. Comprensione della persistenza del dispositivo e Oracle ASMLib

Comprendere i percorsi dei file e come usarli in Linux

Comprensione dei filesystem Linux:ext4 e oltre

Comprendere la differenza tra il comando sudo e su su Linux

Comprendere Bash If Else e altre dichiarazioni condizionali

Comprendere le autorizzazioni di base dei file e la proprietà in Linux

Comprensione delle autorizzazioni UNIX e dei tipi di file