Sto cercando di limitare la larghezza di banda con tc
e 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
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 1 mbit dal rate
parametro? Quali parametri devo impostare per limitare la larghezza di banda a una determinata velocità?
Tuttavia, la man
pagina dice che tbf
dovrebbe essere la qdisc
scelta 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.
tbf
richiede parametri rate
, burst
e ( limit
| latency
). Quindi ho provato quanto segue senza capire come burst
e ( 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 mtu
cose 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 htb
o la tbf
coda per questo?
MODIFICA :
Sulla base di queste risorse, ho effettuato alcuni 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
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 iperf
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 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 iperf
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 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 iperf
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 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 iperf
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.
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.
tc filter
per 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 ...)