Comprensione di tc qdisc e iperf


15

Sto cercando di limitare la larghezza di banda con tce controllare 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 collegate direttamente tramite Ethernet.

Ho quindi impostato un htb qdisccon 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 1 mbit dal rateparametro? Quali parametri devo impostare per limitare la larghezza di banda a una determinata velocità?

Tuttavia, la manpagina dice che tbfdovrebbe essere la qdiscscelta per questa attività:

Il filtro benna token è adatto per rallentare il traffico fino a una velocità configurata con precisione. Adatta bene a larghezze di banda elevate.

tbfrichiede parametri rate, burste ( limit| latency). Quindi ho provato quanto segue senza capire come burste ( limit| latency) influire sulla larghezza di banda disponibile:

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

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

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

ha comportato una larghezza di banda misurata di 1,00 Mbits / sec.

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

Dovrei usare la disciplina htbo la tbfcoda per questo?

MODIFICA :

Sulla base di queste risorse, ho effettuato alcuni test:

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

Misura 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

Considerando che il iperfserver 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 legame

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Misura 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

Considerando che il iperfserver 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 incollaggio (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

Misura 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

Considerando che il iperfserver 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 incollaggio (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

Misura 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

Considerando che il iperfserver 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.

Conclusione

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

Come soluzione alternativa si potrebbero aggiungere le discipline di accodamento direttamente alle interfacce appartenenti al legame.


Stranamente, questo sembra aver funzionato per questo ragazzo: blog.tinola.com/?e=22
Matías E. Fernández

1
Penso che con htb, devi usare tc filterper mettere i pacchetti in classi. Potrebbe anche essere necessario modificare alcuni dei parametri htb (ottimizzarlo proprio come tbf). Suggerisco di esaminare tcng, che è un front-end per TC. (Questi sono suggerimenti rapidi ...)
derobert il

Non ho visto alcun filtro nel tuo post. Quali comandi stai utilizzando per abbinare il traffico in modo che possa essere limitato nella tariffa?

Risposte:


2

Quando non sei sicuro di come tc funzioni, puoi ancora monitorare tc e vedere come scorrono i pacchetti? Puoi usare il mio script per monitorare tc e devi eseguirlo in un terminale con privilegio elevato. 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

0

Prova ad aumentare i valori burst/ limit. Gli algoritmi del bucket token si adattano bene, ma hanno un rapporto precisione / velocità limitato.

La precisione si ottiene utilizzando un piccolo secchio, aumentando la velocità dei token. I token di grandi dimensioni indicano che la velocità con cui vengono riforniti viene ridotta (token al secondo = byte al secondo / byte per token).

Il rateparametro indica la velocità media che non deve essere superata, i parametri bursto limitindicano la dimensione della finestra della media. Poiché l'invio di un pacchetto alla velocità della linea supera la velocità impostata per il tempo in cui il pacchetto viene trasferito, la finestra della media deve essere almeno sufficientemente grande da non inviare l'intera finestra oltre il limite; se più pacchetti si adattano alla finestra, l'algoritmo avrà maggiori possibilità di colpire esattamente il bersaglio.


0

eseguirlo prima di aggiungere la disciplina della coda sull'interfaccia di bonding (bond0 in questo caso)

ipconfig bond0 txqueuelen 1000

non funziona perché il dispositivo virtuale software come l'interfaccia di collegamento non ha una coda predefinita.


0

Poiché i bonddispositivi non hanno una coda definita, l'impostazione delle qdiscdimensioni risolve esplicitamente il problema per me.

Ecco un esempio per una foglia qdiscda usare sotto la HTBstruttura: tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.