Próbuję ograniczyć przepustowość tc
i sprawdzić wyniki za pomocą iperf
. Zacząłem tak:
# 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
Oba wystąpienia są bezpośrednio połączone przez Ethernet.
Następnie ustawiłem htb
qdisc
jedną domyślną klasę, aby ograniczyć przepustowość do 1 Mb / 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 nie dostaję tego, czego oczekuję:
# 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
Jeśli podwoję szybkość, zmierzona przepustowość nie zmienia się. czego mi brakuje? Dlaczego zmierzona przepustowość nie odpowiada 1mbit od rate
parametru? Jakie parametry muszę ustawić, aby ograniczyć przepustowość do dokładnie określonej prędkości?
Jednak man
strona mówi, że to tbf
powinno być qdisc
wyborem dla tego zadania:
Filtr kubełkowy Token jest odpowiedni do spowalniania ruchu do dokładnie skonfigurowanej prędkości. Dobrze skaluje się do dużych pasm.
tbf
wymaga parametrów rate
, burst
i ( limit
| latency
). Próbowałem więc następujących, nie rozumiejąc, jak burst
i ( limit
| latency
) wpływają na dostępną przepustowość:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k
To pozwoliło mi zmierzyć przepustowość na poziomie 113 Kb / s. Zabawa z tymi parametrami nie zmieniła się aż tak bardzo, dopóki nie zauważyłem, że dodanie wartości do mtu
zmian drastycznie:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000
dało zmierzoną przepustowość 1,00 Mb / s.
Jakie parametry musiałbym ustawić, aby ograniczyć szerokość pasma do dokładnie określonej prędkości?
Powinienem użyć htb
lub tbf
kolejkowania do tego?
EDYCJA :
Na podstawie tych zasobów przeprowadziłem kilka testów:
- https://help.ubuntu.com/community/UbuntuBonding
- https://help.ubuntu.com/community/LinkAggregation
- /usr/share/doc/ifenslave-2.6/README.Debian.gz http://lartc.org/
Próbowałem następujących ustawień.
Na maszynie fizycznej
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
Pomiar za 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
Podczas gdy iperf
serwer obliczył inną szerokość pasma:
[ 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 maszynie wirtualnej bez klejenia
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Pomiar za 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
Podczas gdy iperf
serwer obliczył inną szerokość pasma:
[ 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 maszynie wirtualnej z klejeniem (konfiguracja tc 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
Pomiar za 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
Podczas gdy iperf
serwer obliczył inną szerokość pasma:
[ 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 maszynie wirtualnej z klejeniem (konfiguracja tc 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
Pomiar za 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
Podczas gdy iperf
serwer obliczył inną szerokość pasma:
[ 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
Wynik nie zmienia się, jeśli usunę eth1
(interfejs pasywny) z obligacji.
Wniosek
Kontrola ruchu na interfejsie obligacji nie działa, a przynajmniej nie zgodnie z oczekiwaniami. Będę musiał zbadać dalej.
Aby obejść ten problem, można dodać dyscypliny kolejkowania bezpośrednio do interfejsów należących do więzi.
tc filter
aby umieścić pakiety w klasach. Być może trzeba będzie zmienić niektóre parametry htb (dostroić je tak jak tbf). Proponuję zajrzeć do tcng
, który jest front-endem dla tc. (Są to szybkie wskazówki ...)