Ogranicz przychodzące i wychodzące przepustowość i opóźnienia w systemie Linux

15

Zdaję sobie sprawę, że wiele podobnych pytań zostało już zadanych, ale jak dotąd nie znalazłem rozwiązania mojego problemu.

Mam wirtualny serwer linuksowy (z systemem Debian Squeeze), którego używam do testowania prędkości stron internetowych w celu pomiaru wzrostu i zmniejszenia czasu ładowania tych stron. Próbuję ograniczyć przepustowość i opóźnienie tego serwera, aby zbliżyć się do rzeczywistych czasów ładowania na stronach internetowych, ale jak dotąd nie udało się.

To, czego konkretnie chcę, to:

  • Aby ustawić opóźnienie przychodzące i wychodzące na 50 ms.
  • Aby ustawić limit przepustowości przychodzącej 512 kb / s.
  • Aby ustawić limit przepustowości wychodzącej na 4096 kb / s.

Czytałem o netemie i korzystałem z tcpolecenia, ale wciąż wszystko jest trochę powyżej mojej głowy. Udało mi się zebrać to polecenie, aby kontrolować opóźnienie, które wydaje się działać, ale nie jestem nawet pewien, czy to obsługuje tylko wychodzące opóźnienie, czy oba:

tc qdisc add dev eth0 root netem delay 50ms

Jakiś guru sieci, który może mi pomóc?

Edytować:

Po dalszych badaniach dotarłem w połowie drogi do celu, używając tego polecenia cały ruch wychodzący zachowuje się tak, jak chcę:

tc qdisc add dev eth0 root tbf rate 4.0mbit latency 50ms burst 50kb mtu 10000

Nadal jednak nie byłem w stanie prawidłowo ograniczyć ruchu przychodzącego. Nauczyłem się, że powinienem używać „filtra Ingress Policer”. Próbowałem to zrobić za pomocą poniższego polecenia, bawiąc się różnymi wartościami, ale bez powodzenia.

tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match ip src 0.0.0.0/0 flowid :1 police rate 1.0mbit mtu 10000 burst 10k drop

Polecenie wpływa jednak na szerokość pasma, powyższe wartości powodują, że prędkość zaczyna się od 2 MB / s, a wraz z postępem transferu powoli spada do około 80-90 kB / s, które osiąga po około 30 sekundach transferu.

Jakieś pomysły na to, co robię źle?

yzfr1
źródło
netem delay 50msnie ogranicza opóźnienia. Zwiększa opóźnienie w 50msporównaniu z tym, czym byłby inaczej.
kasperd
Rzeczywiście masz rację. Usunąłem limit słów, ponieważ tak naprawdę szukałem wzrostu o 50 ms (ponieważ była to maszyna wirtualna na tym samym komputerze, oryginalne opóźnienie i tak było wystarczająco bliskie
zeru

Odpowiedzi:

12

W końcu zdecydowałem się na ustawienie przepustowości / opóźnienia wychodzącego na serwerze, a następnie robienie tego samego na kliencie, co skutecznie doprowadziło do tego samego rezultatu.

Oto polecenia, które uruchomiłem odpowiednio na serwerze i kliencie, aby osiągnąć moje cele:

Serwer: 4 Mbit 50 ms

tc qdisc add dev eth0 handle 1: root htb default 11
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Mbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 4Mbit
tc qdisc add dev eth0 parent 1:11 handle 10: netem delay 50ms

Klient: 512 kbit 50 ms

tc qdisc add dev vmnet1 handle 1: root htb default 11
tc class add dev vmnet1 parent 1: classid 1:1 htb rate 1000Mbps
tc class add dev vmnet1 parent 1:1 classid 1:11 htb rate 512kbit
tc qdisc add dev vmnet1 parent 1:11 handle 10: netem delay 50ms
yzfr1
źródło
Szukałem tego od miesięcy. Dzięki. Jedno pytanie? Jak usunąć regułę? tc class del dev eth0 root pokazuje odpowiedzi RTNETLINK: Brak takiego pliku lub katalogu
Nur
To było kilka miesięcy temu, ale wydaje mi się, że pamiętam, że wystarczy usunąć qdisc: tc qdisc del dev eth0 root
yzfr1
2

Około 80-90 kB / s dotyczy tego, czego można oczekiwać

    tc filter add ... police rate 1.0mbit ...

Pytasz, czy przychodzące dane są wyrzucane, gdy docierają do 1 mBit / s, czyli około 125 kB / s. Serwer zdalny spadnie wtedy do znacznie niższej wartości (może połowa, nie jestem pewien). Następnie wszystkie pakiety przechodzą, więc zdalny koniec powoli przyspiesza, aż ponownie osiągnie 125 kB / s. Otrzymujesz średnią przepustowość znacznie poniżej 125 kB / s, co jest typowe dla kształtowania wejścia.

Jestem trochę zaskoczony, że prędkość powinna osiągnąć 2 MB / s przy już założonym filtrze polityki wejściowej. Gdzie zmierzyłeś - u klienta (programu) lub na pewnym routerze? A może najpierw nawiązałeś połączenie, a dopiero potem uruchomiłeś filtr zasad wejściowych?

anonimowy miłośnik linuksa
źródło