Snažím se omezit šířku pásma pomocí tc
a zkontrolujte výsledky pomocí iperf
. Začal jsem takto:
# 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
Tyto dvě instance jsou přímo propojeny přes Ethernet.
Potom jsem nastavil htb
qdisc
s jednou výchozí třídou pro omezení šířky pásma na 1 mbit/s:
# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit
Ale nechápu, co očekávám:
# 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
Pokud zdvojnásobím rychlost, naměřená šířka pásma se nezmění. co mi chybí? Proč naměřená šířka pásma neodpovídá 1 mbit od rate
parametr? Jaké parametry musím nastavit, abych omezil šířku pásma na přesně danou rychlost?
Nicméně man
stránka říká, že tbf
by měl být qdisc
pro tento úkol:
Token Bucket Filter je vhodný pro zpomalení provozu na přesně nakonfigurovanou rychlost. Dobře se škáluje na velké šířky pásma.
tbf
vyžaduje parametry rate
, burst
a (limit
| latency
). Zkusil jsem tedy následující, aniž bych pochopil, jak burst
a (limit
| latency
) ovlivnit dostupnou šířku pásma:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k
Tím jsem získal naměřenou šířku pásma 113 Kbit/s. Pohrávání si s těmito parametry se tolik nezměnilo, dokud jsem si nevšiml, že přidání hodnoty pro mtu
mění věci drasticky:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000
výsledkem byla naměřená šířka pásma 1,00 Mbit/s.
Jaké parametry bych musel nastavit, abych omezil šířku pásma na přesně danou rychlost?
Mám použít htb
nebo tbf
kázeň ve frontě kvůli tomu?
UPRAVIT :
Na základě těchto zdrojů jsem provedl několik 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/
Vyzkoušel jsem následující nastavení.
Na fyzickém počítači
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
Měření pomocí 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
Zatímco iperf
server vypočítal jinou šířku pásma:
[ 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
Na virtuálním počítači bez vazby
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Měření pomocí 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
Zatímco iperf
server vypočítal jinou šířku pásma:
[ 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
Na virtuálním počítači s propojením (tc nakonfigurováno na 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
Měření pomocí 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
Zatímco iperf
server vypočítal jinou šířku pásma:
[ 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
Na virtuálním počítači s Bonding (tc nakonfigurován na 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
Měření pomocí 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
Zatímco iperf
server vypočítal jinou šířku pásma:
[ 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
Výsledek se nezmění, pokud odstraním eth1
(pasivní rozhraní) z vazby.
Závěr
Řízení dopravy na vazebním rozhraní nefunguje, nebo alespoň ne podle očekávání. Budu to muset dále prozkoumat.
Jako řešení lze přidat disciplíny řazení do fronty přímo na rozhraní patřící k vazbě.
Přijatá odpověď:
Když si nejste jisti, jak tc funguje, můžete stále sledovat tc a podívat se, jak pakety proudí? Můj skript můžete použít k monitorování tc a potřebujete jej spustit v terminálu se zrušeným oprávněním. Wlan0 můžete změnit na jiné rozhraní a také potřebujete grep a 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