[ Marko_R @ 18.03.2006. 17:32 ] @
Kako može da se raspodeli pravedno link između dva računara koji preko linux rutera idu na internet? Probao sam da koristim iproute2, tj. komandu tc, i qdisc (qeueing discipline) htb (Hierarchical Token Bucket), ali bezuspešno.

Evo detalja. Lnux ruter je preko eth0 povezan na lokalnu mrežu, a preko eth1 ima izlaz na internet 256kbit (koristiću tc oznake po kojima je kbit = kilobita u sekundi, a kbps = kilobajta u sekundi). Ruter ima adresu (lokalnu) 192.168.0.1, a mašine 192.168.0.2 i 192.168.0.3.

Želeo sam da uredim saobraćaj tako da ni jedna mašina ne može da zauzme više od pola linka (osim kad jedino ona downloaduje). Problem je u tome što to jednostavno ne radi, kao da nema tih klasa i garantovanog protoka. Iako po dokumentaciji bi tebalo da radi. Korsitio sam HTB Linux queuing discipline manual - user guide.

Koristio sam sledeći skript:

Code:

#!/bin/bash

PATH=/usr/local/sbin:/usr/sbin:/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin

INET_SPEED=256 # brzina interneta
TOTAL_SPEED=102400 # ukupna brzina, 100mbit = 102400kbit
LOC_SPEED=`expr $TOTAL_SPEED - $INET_SPEED` # deo bandwidth-a za lokalni saobraćaj

tc qdisc add dev eth0 handle 1: root htb default 21
        tc class add dev eth0 classid 1:1 parent 1: htb rate ${TOTAL_SPEED}kbit ceil ${TOTAL_SPEED}kbit
                tc class add dev eth0 classid 1:10 parent 1:1 htb rate ${LOC_SPEED}kbit ceil ${TOTAL_SPEED}kbit
                tc class add dev eth0 classid 1:11 parent 1:1 htb rate ${INET_SPEED}kbit ceil ${INET_SPEED}kbit
                        tc class add dev eth0 classid 1:21 parent 1:11 htb rate 128kbit ceil ${INET_SPEED}kbit
                        tc class add dev eth0 classid 1:22 parent 1:11 htb rate 128kbit ceil ${INET_SPEED}kbit

tc filter add dev eth0 parent 1:0 prio 1 protocol ip u32 match ip src 192.168.0.0/16 flowid 1:10
tc filter add dev eth0 parent 1:0 prio 2 protocol ip u32 match ip dst 192.168.0.2    flowid 1:21
tc filter add dev eth0 parent 1:0 prio 3 protocol ip u32 match ip dst 192.168.0.3    flowid 1:22


Kad na jednoj mašini pustim 6 paralelnih download-a a na drugoj samo jedan, ona dobije oko 3 puta više.

Da li je možda trebalo da koristim cbq?

[Ovu poruku je menjao Marko_R dana 18.03.2006. u 18:34 GMT+1]
[ Milan Andjelkovic @ 18.03.2006. 21:44 ] @
Baš sam hteo da te pitam zašto komplikuješ i ne koristiš cbq, kad videh da si ga spomenuo na kraju posta. Dakle - cbq i nema da te boli glava :)

Pritom je cbq i prilično konfigurabilan, tako da se ne može reći da gubiš na dijapazonu mogućnosti ako koristiš njega.

btw. zašto bi pravio da nijedan komp ne može da uzme više od pola linka, kad možeš da napraviš da budu ograničeni da polovinu, ali da mogu da 'pozajmljuju' od ostatka ako je isti slobodan?

[Ovu poruku je menjao Milan Andjelkovic dana 18.03.2006. u 22:46 GMT+1]
[ VRider @ 18.03.2006. 23:22 ] @
Da budu ograniceni na pola, ali da mogu da uzimaju i ostatak ako je slobodan? To je vec zanimljivo, ali, jedno na sta sam nailazio a da omogucuje tako nesto je neka budzevina na shell skriptom koji je pratio konekcije?! Ili imas neki link da se izbacis?
Jedino sto je meni palo na pamet su prioriteti po protokolima (portovima), pomocu htb-a, u kombinaciji sa cbq-om i limitiranjem ukupne brzine.
[ Marko_R @ 18.03.2006. 23:23 ] @
Citat:
Milan Andjelkovic: Baš sam hteo da te pitam zašto komplikuješ i ne koristiš cbq, kad videh da si ga spomenuo na kraju posta. Dakle - cbq i nema da te boli glava :)

Pritom je cbq i prilično konfigurabilan, tako da se ne može reći da gubiš na dijapazonu mogućnosti ako koristiš njega.

Pa htb sam koristio zato što je cbq dosta komplikovan za podešavanje, a htb ima samo 2 opcije - rate i ceil.

Citat:
btw. zašto bi pravio da nijedan komp ne može da uzme više od pola linka, kad možeš da napraviš da budu ograničeni da polovinu, ali da mogu da 'pozajmljuju' od ostatka ako je isti slobodan?

Pa to baš pravim, stavio sam za obe klase da ceil bude jednak ukupnom kapacitetu linka, pogledaj skriptu.

[ Marko_R @ 18.03.2006. 23:36 ] @
Citat:
VRider: Da budu ograniceni na pola, ali da mogu da uzimaju i ostatak ako je slobodan? To je vec zanimljivo, ali, jedno na sta sam nailazio a da omogucuje tako nesto je neka budzevina na shell skriptom koji je pratio konekcije?! Ili imas neki link da se izbacis? :)
Jedino sto je meni palo na pamet su prioriteti po protokolima (portovima), pomocu htb-a, u kombinaciji sa cbq-om i limitiranjem ukupne brzine.

Čekaj nije mi baš jasno šta si napisao, hoćeš da kombinuješ htb i cbq? To nije moguće, jer interfejs može da ima samo jednu root disciplinu ređanja (qdisc). A za link što pitaš, dovoljno je da pogledaš onaj gore koji sam ostavio za htb, lepo piše da klase mogu da pozajmljuju jedna od druge, samo je pitanje da li ćeš i koliko to da ograničiš sa ceil opcijom. I ima jedno lepo pravilo koje glasi: kapacitet koji dobija klasa nije manji od

min { kapacitet koji ona zahteva, vrednost rate opcije }

rate opcija određuje minimum koju klasa može da dobije, dakle to je tzv. zagarantovani protok. Drugim rečima, ako klasa zahteva više nego što joj je zagarantovano, ne može da dobije manje nego što joj je zagarabntovano.
[ VRider @ 18.03.2006. 23:45 ] @
Nisam mislio na kombinovanje navedenog, nego na neku kombinaciju mogucnosti. Bilo bi dobro da moze (kao sto ne moze).
No, nebitno...
[ Marko_R @ 19.03.2006. 10:32 ] @
Otkrio sam u čemu je bio problem. Link treba ograničiti na malo manje od svog teoretskog maksimuma. Čim sam smanjio na 240kbit, proradilo je sa dosta dobrom preciznošću. Samo onda je ukupna brzina malo okrnjena. Da li možda cbq nema ovaj problem?
[ Milan Andjelkovic @ 20.03.2006. 10:22 ] @
Nisam nikad praktično probao to sa pozajmljivanjem bandwidth-a, ali koristeći cbq.init konfiguracija bi izgledala npr. ovako:

cbq-0001.root

DEVICE=eth0,100Mbit,10Mbit
RATE=256Kbit
WEIGHT=25Kbit
PRIO=5
LEAF=tbf
BOUNDED=yes
ISOLATED=no
RULE=,10.0.0.0/8
RULE=10.0.0.0/8,

cbq-0002.root

DEVICE=eth1,100Mbit,10Mbit
RATE=256Kbit
WEIGHT=25Kbit
PRIO=5
LEAF=tbf
BOUNDED=yes
ISOLATED=no
RULE=,10.0.0.0/8
RULE=10.0.0.0/8,

cbq-0003.child1

DEVICE=eth0,100Mbit,10Mbit
RATE=128Kbit
WEIGHT=12Kbit
PRIO=5
PARENT=0001
LEAF=sfq
BOUNDED=no
RULE=,10.0.1.0/24
RULE=10.0.1.0/24,

cbq-0004.child1

DEVICE=eth1,100Mbit,10Mbit
RATE=128Kbit
WEIGHT=12Kbit
PRIO=5
PARENT=0002
LEAF=sfq
BOUNDED=no
RULE=,10.0.1.0/24
RULE=10.0.1.0/24,

cbq-0005.child2

DEVICE=eth0,100Mbit,10Mbit
RATE=128Kbit
WEIGHT=12Kbit
PRIO=5
PARENT=0001
LEAF=sfq
BOUNDED=no
RULE=,10.0.2.0/24
RULE=10.0.2.0/24,

cbq-0006.child2

DEVICE=eth1,100Mbit,10Mbit
RATE=128Kbit
WEIGHT=12Kbit
PRIO=5
PARENT=0002
LEAF=sfq
BOUNDED=no
RULE=,10.0.2.0/24
RULE=10.0.2.0/24,

Ako nećeš da koristiš cbq.init onda pogledaj recimo ovaj link.
[ Marko_R @ 20.03.2006. 17:14 ] @
Probao sam sa cbq.init, ali ista stvar kao i sa htb

Ali naravno to je ipak samo par procenata. Nastaviću da koristim htb, cbq vidim da ima dosta mogućnosti ali one meni nisu potrebne.

[Ovu poruku je menjao Marko_R dana 20.03.2006. u 18:16 GMT+1]