# PROBLEMA: limitare la banda con tc

## nilo888

ciao a tutti,

sto facendo dei test per liimitare la banda flaggando i pacchetti con iptables

```

...

iptables -t mangle -A OUTPUT -d 192.168.0.10 --protocol tcp --sport 22 -j MARK --set-mark 2

iptables -t mangle -A OUTPUT -d 192.168.0.10 --protocol tcp --sport 20  -j MARK --set-mark 3

...

```

come vedete sulla porta 22 e 20: poi avviero' un trasferimento con scp e uno con ftp attivo(verificato)

i comandi tati a tc sono

```

+ tc qdisc add dev eth0 root handle 1: htb default 10

+ tc class add dev eth0 parent 1: classid 1:1 htb rate 80kbps burst 6k

+ tc class add dev eth0 parent 1:1 classid 1:10 htb rate 60kbps burst 6k prio 1

+ tc class add dev eth0 parent 1:1 classid 1:20 htb rate 60kbps burst 6k prio 2

+ tc class add dev eth0 parent 1:1 classid 1:30 htb rate 60kbps burst 6k prio 3

+ tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10

+ tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

+ tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10

+ tc filter add dev eth0 parent 1: protocol ip prio 1 handle 1 fw classid 1:10

+ tc filter add dev eth0 parent 1: protocol ip prio 2 handle 2 fw classid 1:20

+ tc filter add dev eth0 parent 1: protocol ip prio 3 handle 3 fw classid 1:30

```

questo e' quello che succede quando avvio ftp e ssh insieme su una lan100

tc -s class show dev eth0

```

class htb 1:1 root rate 640000bit ceil 640000bit burst 6Kb/8 mpu 0b overhead 0b cburst 1679b/8 mpu 0b overhead

 0b level 7

 Sent 132714660 bytes 96898 pkt (dropped 0, overlimits 0 requeues 0)

 rate 963840bit 83pps backlog 0b 0p requeues 0

 lended: 0 borrowed: 0 giants: 0

 tokens: -59999999 ctokens: -59999999

class htb 1:10 parent 1:1 leaf 10: prio 1 rate 480000bit ceil 480000bit burst 6Kb/8 mpu 0b overhead 0b cburst

1659b/8 mpu 0b overhead 0b level 0

 Sent 6654220 bytes 12710 pkt (dropped 0, overlimits 0 requeues 0)

 rate 2480bit 3pps backlog 0b 0p requeues 0

 lended: 12710 borrowed: 0 giants: 0

 tokens: 103902 ctokens: 27374

class htb 1:20 parent 1:1 leaf 20: prio 2 rate 480000bit ceil 480000bit burst 6Kb/8 mpu 0b overhead 0b cburst

1659b/8 mpu 0b overhead 0b level 0

 Sent 63009910 bytes 42543 pkt (dropped 0, overlimits 0 requeues 0)

 rate 480712bit 40pps backlog 0b 30p requeues 0

 lended: 42513 borrowed: 0 giants: 0

 tokens: 25846 ctokens: -50682

class htb 1:30 parent 1:1 leaf 30: prio 3 rate 480000bit ceil 480000bit burst 6Kb/8 mpu 0b overhead 0b cburst

1659b/8 mpu 0b overhead 0b level 0

 Sent 63145912 bytes 41708 pkt (dropped 0, overlimits 0 requeues 0)

 rate 480432bit 39pps backlog 0b 33p requeues 0

 lended: 41675 borrowed: 0 giants: 0

 tokens: 25557 ctokens: -50971

```

come vedete la limitazione di banda funziona quello che non finziona e' che la somma di tutto il traffico non dovrebbe superare i 80kbyte al secondo invece va a quasi 120... qualcuno mi sa spiegare come mai?

----------

## noppy

mmh , io uso una cosa di questo genere e mi funziona , pero' non uso iptables per marcare il traffico ma regole dirette con il filtro u32

```
tc qdisc add dev eth2 handle 1:0 root dsmark indices 8 default_index 0

tc qdisc add dev eth2 handle 2:0 parent 1:0 htb

tc class add dev eth2 parent 2:0 classid 2:1 htb rate 1310720bps ceil 1310720bps

tc class add dev eth2 parent 2:1 classid 2:2 htb rate 65536bps ceil 524288bps prio 0

tc qdisc add dev eth2 handle 3:0 parent 2:2 sfq

tc class add dev eth2 parent 2:1 classid 2:3 htb rate 65536bps ceil 1310720bps prio 0

tc qdisc add dev eth2 handle 4:0 parent 2:3 sfq

tc class add dev eth2 parent 2:1 classid 2:4 htb rate 65536bps ceil 1310720bps prio 0

tc qdisc add dev eth2 handle 5:0 parent 2:4 sfq

tc class add dev eth2 parent 2:1 classid 2:5 htb rate 32768bps ceil 1310720bps prio 1

tc qdisc add dev eth2 handle 6:0 parent 2:5 sfq

tc class add dev eth2 parent 2:1 classid 2:6 htb rate 32768bps ceil 1310720bps prio 1

tc qdisc add dev eth2 handle 7:0 parent 2:6 sfq

tc class add dev eth2 parent 2:1 classid 2:7 htb rate 16384bps ceil 1310720bps prio 1

tc qdisc add dev eth2 handle 8:0 parent 2:7 sfq

.... (regole u32) ....
```

P.S.

Il codice di TC e' generato da tcng che è un po' piu' umano per quanto riguarda il linguaggio

----------

## nilo888

si sembra abbastanza simile al mio...

ma quindi se tu riduci il rate e il ceil di 

```

tc class add dev eth2 parent 2:0 classid 2:1 htb rate 1310720bps ceil 1310720bps 

```

riesci a rallentare tutta la connessione? perche a me serve appunto che la connessione totale non superi fli 80kbyte per secondo:

```

+ tc class add dev eth0 parent 1: classid 1:1 htb rate 80kbps burst 6k 

```

il che dovrebbe essere gia scritto qui^ no? ma non funge non vorrei che mi mancasse qualcosa...

insomma ssh e ftp che hanno al max 60kbyte/s ognuno si devono spartire 80kbyte/s di totale(scelto da me la connessione puo' andare molto di piu! Io riesco a limitare entrambi ai 60kbyte/s ma insieme arrivano a 120kbyte/s il che non dobrebbe accadere giusto?

----------

## noppy

si esatto ma credo ti manchi il ceil che se non ricordo male definisce la grandezza (in banda) della cella , altrimenti l'htb , sempre se ricordo bene , utilizza il massimo della banda per poi rallentarla al valore da te prescelto in base alle altre regole htb , ma visto che la root e' una cella unica senza il ceil mi sa che non limita un tubo ma usa tutta la banda .

----------

## nilo888

No purtroppo no... il ceil se vedi nell'ultima sezione di codice del primo post 

```

class htb 1:1 root rate 640000bit ceil 640000bit burst 6Kb/8 mpu 0b overhead 0b cburst

```

 e' di default uguale al rate e ho provato anche a cambiarlo nello script ma non ha effetto

e' assurdo perche se vedi sempre in quel riquadro di codice che e' l'output della analisi mentre sta lavorando il rate effettivo e' maggiore di quello da me scelto e del ceil:

```

class htb 1:1 root rate 640000bit ceil 640000bit burst 6Kb/8 mpu 0b overhead 0b cburst 1679b/8 mpu 0b overhead

 0b level 7

 Sent 132714660 bytes 96898 pkt (dropped 0, overlimits 0 requeues 0)

 rate 963840bit 83pps backlog 0b 0p requeues 0

 lended: 0 borrowed: 0 giants: 0

 tokens: -59999999 ctokens: -59999999 

```

```

...rate 640000bit ceil 640000bit....

,,,,

,,,rate 963840bit.....

```

non so che pensare.... cmq grazie lo stesso per l'aiuto!!!

----------

## noppy

hai ragione , non avevo letto attentamente . Cmq è strano , anche se mi pare ci sia una nuova versione di htb che dovrebbe essere piu' rigorosa .

Quello che posso consigliarti , se non hai gia' provato , è di usare tcng e far creare a lui le regole di tc in modo da provare se per caso in questo modo risolvi il problema

----------

## Merlink

Anche io uso tc, anzi usavo...

Non avete avuto problemi di latenza?

Nel mio caso, con icmp in ingresso ed uscita nella coda a piu' alta priorità e senza traffico, il ping verso libero raggiungeva i 4000 msec.

----------

## nilo888

ok penso di esserci riuscito.

facendo un po di esperimenti sono arrivato a queste conclusioni empiriche:

1) il rate e' la banda garantita quindi se la somma del rate delle sottoclassi e' superiore a quella della classe (e anche del suo ceil) la cosa non funziona =>  si sorpassera' il rate della classe per soddisfare  minimo garantito delle sottoclassi

2) se la somma del rate delle sottoclassi e' minore o uguale al rate (o ceil) della classe superiore non avverra' la superazione del ceil della classe superiore

in CONCLUSIONE 

rate: banda garantita salvo superamento della banda massima dell'interfaccia

ceil: tetto al quale si puo arrivare se c'e' banda disponibile( fino al ceil della classe superiore o comunque alla saturazione della banda disponibile nella classe superiore,

Questo e' quanto ho capito io EMPIRICAMENTE e mi pare funzionante, se credete che io abbia sbagliato vi pregherei di correggermi. GRAZIE

ps I ping non ho provato a metterli in cima alla priorita' ma non ho problemi di latenza per ora..

----------

