Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witajcie
Na jednym z serwerów mam spory download (obrazy iso płyt). Niestety niektórzy userzy używający różnych akceleratorów pobierania plików potrafią tak zapchać łącze, że dla innych ledwo starcza. Czy da się to jakoś dynamicznie i sprawiedliwie podzielić? Łącze do serwera to 8Mbit. Od razu mówię że limitowanie ruchu na sztywno nie wchodzi w grę. Wiem jak to zrobić we FreeBSD za pomocą ipfw+dummynet, ale zmiana systemu będzie uciążliwa.
We FreeBSD regułki wyglądałyby następująco:
ipfw add pipe 1 tcp fron any to 10.0.0.1 80
ipfw queue 1 config weight 5 pipe 2 mask src-ip 0xffffffff
ipfw pipe 1 config 8Mbit/s
Ta reguła wydaje mi się że jest łatwa do rozszyfrowania, ale na wszelki wypadek wyjaśniam. Szerokość pipe’a jest ustawiona na 8M bo takie jest tam łącze symetryczne. Przy takiej konfiguracji każdemu użytkownikowi zostanie dynamicznie przydzielone takie samo pasmo z/do serwera, czyli np.
- jeśli dwóch będzie użytkowników ściągało jednocześnie to każdy dostanie po 4M łącza
- jeśli dwóch będzie użytkowników ściągało jednocześnie ale jeden z nich otworzy kilka sesji jednoczesnego pobierania (np. takie windowsowe programy typu flashget co dzielą plik na części i otwierają wiele sesji na raz) to i tak każdy dostanie po 4M
- przy 4 użytkowników jednoczesnych podzieli to się samo równo po 2 M na głowę bez względu na liczbę otwartych połączeń.
Da się coś takiego w linuksie uzyskać w podobnie prosty sposób?
Z gory dziękuje. Pozdrawiam.
Ostatnio edytowany przez bryn1u (2010-05-25 16:32:16)
Offline
Zainstaluj iproute - i poszukaj o kształtowaniu i zarządzaniu pasmem przy pomocy narzędzia tc.
Tu masz wyjaśnienie: http://marcin.przybytek.net/download/2.4routing.pdf
Na forum też jest trochę przykładów.
Natomiast jeśli masz to postawione na apachu - to (o ilę pamiętam) jest do niego (chyba nie obejdzie się bez kompilacji) moduł load-balancing.
Jest też w repo moduł libapache2-mod-bw - który też jest od tego (w jakimś zakresie)
To by było na tyle.
;)
Ostatnio edytowany przez Jacekalex (2010-05-25 17:00:27)
Offline
Dzięki, ale to co podałeś nie do końca spełnia moje oczekiwania. Pogooglałem i znalazłem port dummynetu do linuksa. http://lists.freebsd.org/pipermail/freebsd-ipfw/2009-June/003916.html
No wlasnie. Kompilacje mnie przeraza. ( I hate it)
Offline
Dlaczego niezupełnie?
Tworzysz kolejkę na interfejsie eth0, dajesz jej moduł sfq (:~$ modinfo sch_sfq), (sprawiedliwego podziału pasma) lub rozszerzoną wersję - esfq (wymaga kompilacji kernela i iproute) i po sprawie.
Przykładowo w domu (do imq) mam tak zrobione kolejki:
echo "# upload" IF1='eth0' $tc qdisc del root dev $IF1 2> /dev/null $tc qdisc add dev $IF1 root handle 1:0 htb default 70 r2q 1 #[b]potrzebujesz tylko kolejki głównej[/b] #kolejki dzielące pasmo (tutaj wyłącznie priorytet kolejek) - priorytety dla poszczególnych protokołów sieciowych (u mnie layer7) u Ciebie niekonieczne. $tc class add dev $IF1 parent 1:0 classid 1:10 htb rate $UP ceil $UP prio 1 $tc class add dev $IF1 parent 1:0 classid 1:20 htb rate $UP ceil $UP prio 2 $tc class add dev $IF1 parent 1:0 classid 1:20 htb rate $UP ceil $UP prio 3 $tc class add dev $IF1 parent 1:0 classid 1:40 htb rate $UP ceil $UP prio 4 $tc class add dev $IF1 parent 1:0 classid 1:50 htb rate $UP ceil $UP prio 5 $tc class add dev $IF1 parent 1:0 classid 1:60 htb rate $UP ceil $UP prio 6 $tc class add dev $IF1 parent 1:0 classid 1:70 htb rate $UP ceil $UP prio 7 echo "# upload - filtry" FIltry raczej nie będa Ci potrzebne (chyba, że do oznaczenia pakietów z serwera www) - oznaczysz łatwo, używając modułu owner do iptables. $tc filter add dev $IF1 parent 1:0 protocol ip handle 10 fw classid 1:10 $tc filter add dev $IF1 parent 1:0 protocol ip handle 20 fw classid 1:20 $tc filter add dev $IF1 parent 1:0 protocol ip handle 30 fw classid 1:30 $tc filter add dev $IF1 parent 1:0 protocol ip handle 40 fw classid 1:40 $tc filter add dev $IF1 parent 1:0 protocol ip handle 50 fw classid 1:60 $tc filter add dev $IF1 parent 1:0 protocol ip handle 60 fw classid 1:60 $tc filter add dev $IF1 parent 1:0 protocol ip handle 70 fw classid 1:70 echo "# upload - SFQ" - SFQ - zasada sprawiedliwego podziału pasma - to powinno załatwić sprawę. #algorytm mieszający rozdziela pasmo równomiernie na poszczególne aktywne połączenia. $tc qdisc add dev $IF1 parent 1:10 handle 10:0 sfq perturb 10 $tc qdisc add dev $IF1 parent 1:20 handle 20:0 sfq perturb 10 $tc qdisc add dev $IF1 parent 1:30 handle 10:0 sfq perturb 10 $tc qdisc add dev $IF1 parent 1:40 handle 40:0 sfq perturb 10 $tc qdisc add dev $IF1 parent 1:50 handle 50:0 sfq perturb 10 $tc qdisc add dev $IF1 parent 1:60 handle 60:0 sfq perturb 10 $tc qdisc add dev $IF1 parent 1:70 handle 70:0 sfq perturb 10
Radzę spróbować
To by było na tyle.
Ostatnio edytowany przez Jacekalex (2010-05-25 22:25:41)
Offline
Dzieki wielkie. Jeszcze jedno pytanie. Czy koniecznie musze stosowac imq bo tego nie mam w produkcyjnym kernelu i nie bardzo moge w nim grzebac bo wtedy trace support. Nie ma jakiegos rozwiazania out of the box.
Z gory dziekuje. Pozdrawiam.
Offline
Jeżeli problem dotyczy tylko ruchu wychodzącego to imq nie jest ci potrzebne.
Offline