Zrozumienie tc qdisc i iperf


15

Próbuję ograniczyć przepustowość tci 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 qdiscjedną 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 rateparametru? Jakie parametry muszę ustawić, aby ograniczyć przepustowość do dokładnie określonej prędkości?

Jednak manstrona mówi, że to tbfpowinno być qdiscwyborem 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.

tbfwymaga parametrów rate, bursti ( limit| latency). Próbowałem więc następujących, nie rozumiejąc, jak bursti ( 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 mtuzmian 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ć htblub tbfkolejkowania do tego?

EDYCJA :

Na podstawie tych zasobów przeprowadziłem kilka testów:

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 iperfserwer 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 iperfserwer 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 iperfserwer 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 iperfserwer 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.


O dziwo, wydaje się, że to zadziałało dla tego faceta: blog.tinola.com/?e=22
Matías E. Fernández

1
Myślę, że z htb musisz użyć, tc filteraby 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 ...)
derobert

W twoim poście nie widziałem żadnych filtrów. Jakich poleceń używasz, aby dopasować ruch do limitu prędkości?

Odpowiedzi:


2

Jeśli nie masz pewności, jak działa tc, możesz nadal monitorować tc i sprawdzać, jak przepływają pakiety? Możesz użyć mojego skryptu do monitorowania tc i musisz uruchomić go w terminalu z podniesionymi uprawnieniami. Możesz zmienić wlan0 na inny interfejs, a także potrzebujesz grep i 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

Spróbuj zwiększyć wartości burst/ limit. W tokenami algorytm skali dobrze, ale mają ograniczony wskaźnik dokładności / prędkości.

Dokładność osiąga się za pomocą małego wiaderka, a prędkość zwiększa się poprzez zwiększenie wielkości żetonów. Duże tokeny oznaczają zmniejszenie szybkości ich uzupełniania (tokeny na sekundę = bajty na sekundę / bajty na token).

Ten rateparametr podaje średnią szybkość, której nie należy przekraczać, burstlub limitparametry określają wielkość okna uśredniania. Ponieważ wysyłanie pakietu z prędkością linii przekracza ustawioną szybkość dla czasu, w którym pakiet jest przesyłany, okno uśredniania musi być co najmniej wystarczająco duże, aby wysłanie pojedynczego pakietu nie przepchnęło całego okna ponad limit; jeśli w oknie zmieści się więcej pakietów, algorytm będzie miał większą szansę na trafienie w cel dokładnie.


0

uruchom to przed dodaniem dyscypliny kolejki do interfejsu łączenia (w tym przypadku bond0)

ipconfig bond0 txqueuelen 1000

nie działa, ponieważ programowe urządzenie wirtualne, takie jak interfejs łączenia, nie ma domyślnej kolejki.


0

Ponieważ bondurządzenia nie mają zdefiniowanej kolejki, qdiscjawne ustawienie tego problemu rozwiązuje problem.

Oto przykład użycia liścia qdiscw HTBstrukturze: tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.