Tutorials

  • Presto on-line...

About ...

  • ... questo sito
  • ... me


Controllo dinamico della ampiezza di banda

throttled, bandwidth, ipfw
Throttled è un programma che limita il traffico dei pacchetti di rete a salvaguardia della banda. Per i più tecnici, in inglese suona così: throttled is a bandwidth shaping application. Non usa più del 2% della CPU; il codice sorgente (licenza GPL) è semplicissimo... solo una paginetta di c++; per MacOS X viene distribuito già complato e si installa in 5 minuti!

throttled della IntrArts Creative Media

throttled è un software Open Source, rilasciato dalla IntrArts Creative Media sotto licenza GPL, per il controllo della banda in entrambe le direzioni: upload e download.

Esistono altri ottimi programmi per il controllo della banda con OS X, ma questa soluzione si presta ad essere automatizzata con script da terminale, al contrario di quanto sarebbe possibile per esempio con CarraFix. Inoltre il consumo di risorse è veramente ridicolo e vengono consumate solo in presenza di traffico di rete che coincida con almeno una regola impostata nel firewall interno a OS X (o darwin ovviamente).

- Immaginiamo questo scenario:
Abbiamo una macchina OS X che deve costantemente fare il mirror di due siti ftp composti da migliaia di piccoli files, via unison oppure wget, curl, rsync, rdist o similari.

Immaginiamo per semplicità di voler usare curl, presente di default sotto MacOS X.
Il problema è che non vogliamo che durante le ore di lavoro (dalle 08.00 alla 17.00) il mirroring occupi tutta la banda ma solo la metà, inoltri non vogliamo che riparta il curl per non fargli perdere mezzora a controllare se tra i migliaia di files da mirrorare qualcuno è stato aggiornato rispetto alla versione locale.

Ovviamente questo è il mio problema, ma tale soluzione si presta a moltissimi scenari ove serve un controllo della banda. Inoltre questa soluzione non è legata a OS X, si presta anche a linux e a *freebsd con pochissime modifiche più che altro alle rule del firewall.

La soluzione si chiama Throttled! Un versatile programma di controllo di ampiezza di banda. Throttled crea uno o più socket che possono comunicare con il firewall di OS X tramite la dichiarazione divert, e può gestire diverse velocità di transito anche contemporaneamente.

Installiamo throttled

Scarica il file sorgente da questa pagina: http://www.intrarts.com/throttled.html
Decomprimilo nel desktop e installa il pacchetto con il terminale:

$ cd Desktop/Throttled3.0
$ sudo ./install.sh
     (scrivere la password se viene richiesta)

Con un qualsiasi editor, cambia il path del file /etc/profile aggiungendo
il percorso: :/usr/local/bin:/usr/local/sbin

Questa
modifica permette di poter richiamare il programma da qualunque directory.
Ecco come si presenta il mio file dopo la modifica:
$ more /etc/profile
# System-wide .profile for sh(1)

PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
export PATH

[ -r /etc/bashrc ] && source /etc/bashrc

A questo punto riavvia il terminale oppure dai il comando: source
/etc/profile
per eseguire le modifiche apportate al file.

Un primo test

Per il momento prova il funzionamento via terminale, in seguito scriverai
uno script di avvio a seconda delle tue necessità.
Devi esegiuire i comandi come root, quindi dai un sudo
su
nel terminale.
1) crea una prima regola (sulla divert port 100) per l’alta velocità con
limite, per esempio, a 9-10 KB/s
e una seconda regola (sulla divert port 101) per la bassa velocità con
limite a 4.5-5 KB/s

$ sudo ./install.sh
     (scrivere la password se viene richiesta)
$ throttled -s 14336 -d 100 -L
$ throttled -s 5600 -d 101 -L

N.B. il parametro -s indica la velocità limite desiderata in byte al
secondo. Per limitare a 10 KB/sec: 10x1024 = 10’240 ma per qualche motivo
questo valore va aumentato di un 30% 40% circa.... provare per credere!!!
2) resetta il firewall (ipfw) e imposta
la velocità sulla regola numero 100:
$ ipfw -f flush
$ ipfw add divert 100 ip from any to any via any

Apri un altra finestra terminale e comincia a scaricare con curl un
file abbastanza grosso da un sito qualsiasi, per esempio:
$ curl -O http://ftp.de.debian.org/debian-cd/images/3.0_r2/powerpc/debian-30r2-powerpc-binary-1_NONUS.iso

Noterai che la velocità in media non riesce a salire oltre ai
10 KB/s stabiliti. Lasciala continuare lo scaricamento.
Ora abbassiamo la velocità con questi comandi nel terminale di
root:
Innanzitutto resetta ipfw, e noterai che la velocità di scaricamento
aumenta fino ad arrivare al massimo consentito dalla rete e dal server
ftp stesso.
$ ipfw -f flush

ora abbassa la velocità:
$ ipfw add divert 101 ip from any to any via any

Con questo ultimo comando, noterai che la velocità scende considerevolmente
fino ad assestarsi attorno ai 4,5 Kbs o poco più.
Se tutto funziona fino a qui, ora sei pronto a creare uno script per
alzare o abbassare l’ampiezza di banda.

Prepariamo una configurazione migliore

Il problema dei comandi che abbiamo testato nell’esempio precedente, è che
abbiamo limitato l’ampiezza di banda del computer da e verso qualsiasi
indirizzo, quindi in realtà non è molto
utile cosí com’è. Proprio per questo bisogna decidere cosa
va limitato e cosa no.
Nel mio caso (il mirroring di un sito) la soluzione è abbastanza
semplice. si tratta infatti di lasciare tutto invariato (nessuna limitazione
di banda) tranne quello che proviene da due siti ftp differenti.
Con un semplice: $ ping sito.ftp.1.com e $ ping
sito.ftp.2.com
… otteniamo gli indirizzi IP dei server
che ci interessano.

Quindi a questo punto basta scrivere una regola nel firewall di OS X
che devii il flusso di bytes proveniente da quegli indirizzi IP verso
uno dei socket di throttled, che nel mio caso
sono il numero 1000 (alta vel.) e 1001 (bassa vel.).
Sostituiamo lo script di base /usr/local/sbin/throttled-startup con
questo:

#!/bin/sh
# Qui una serie di esempi di velocità in bytes:
# 512k - "MAXSPEED=61440"
# 256k - "MAXSPEED=30720"
# 128k - "MAXSPEED=14336"
# qui imposta una velocità minima e una massima
MAXSPEED=61440
MINSPEED=30720
#crea una alta velocità' con limite a 512k:
throttled -s $MAXSPEED -d 1000 -L
# crea una bassa velocità' con limite a 256k
throttled -s $MINSPEED -d 1001 -L

(il file throttled-startup viene eseguito
automaticamente al boot da:
/Library/StartupItems/throttledStartup/throttledStartup)
Ora creiamo i due file /usr/local/sbin/throttled-HI e /usr/local/sbin/throttled-LO:
throttled-HI:
#!/bin/sh
# Azzero regole del firewall
ipfw -f flush
# qui definisci l'indirizzo IP di due siti ftp
SITO1=123.123.123.123
SITO2=123.456.789.123
# Limita sito.ftp.1.com a MAXSPEED sulla rule n. 1000
ipfw add divert 1000 tcp from $SITO1 to any via any # Limita sito.ftp.2.com a MAXSPEED sulla rule n. 1000
ipfw add divert 1000 tcp from $SITO2 to any via any

throttled-LO:
#!/bin/sh
# Azzero regole del firewall
ipfw -f flush
# qui definisci l'indirizzo IP di due siti ftp
SITO1=123.123.123.123
SITO2=123.456.789.123
# Limita sito.ftp.1.com a MINSPEED sulla rule n. 1001
ipfw add divert 1001 tcp from $SITO1 to any via any
# Limita sito.ftp.2.com a MINSPEED sulla rule n. 1001
ipfw add divert 1001 tcp from $SITO2 to any via any

Bene, ora prova il sistema:
comincia a scaricare dal sito sito.ftp.1.com un
file di grosse dimensioni e controlla la velocità.
Come root dai il comando:
1
$ cd Desktop/Throttled3.0
$ sudo ./install.sh
     (scrivere la password se viene richiesta)

e vedrai la banda usata solo per il sito sito.ftp.1.com ridursi a quanto
indicato in MINSPEED.
Ora dai il comando
1
$ more /etc/profile
# System-wide .profile for sh(1)

PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
export PATH

[ -r /etc/bashrc ] && source /etc/bashrc

e vedrai la banda assegnata allo scaricamento dal server sito.ftp.1.com aumentare fino ad assestarsi a quanto indicato su MAXSPEED.
Con questo metodo hai ottenuto un controllo dell’ampiezza di banda
in download solo ed esclusivamente per i due siti sito.ftp.1.com e sito.ftp.2.com.

Tutto il resto del sistema continua ad non avere limitazioni.
A questo punto si possono modificare le impostazioni di crontab di
root, in modo che applichi le limitazioni adeguate in base all’orario.

Nel mio caso ho assegnato 512 K di notte e 256 K di giorno.
1
$ sudo ./install.sh
     (scrivere la password se viene richiesta)
$ throttled -s 14336 -d 100 -L
$ throttled -s 5600 -d 101 -L

Conclusione

Con questo HOWTO ho affrontato un problema reale e trovato una soluzione
valida senza modificare pesantemente il sistema operativo.

La soluzione inoltre è estremamente estensibile e adattabile alle
più svariate esigenze di controllo di banda sia un upload che
in download.

A tale proposito consiglio di leggere i commenti scritti nel file
originale /usr/local/sbin/throttled-startup e nel readme allegato alla
distribuzione oltre che al manuale di ipfw (man
ipfw
).
Attenzione in particolare al comando ipfw -f
flush
che resetta (cancella) tutte le regole eventualmente già assegnate
al firewall. Nell’esempio di questo articolo è stato usato per rendere
la spiegazione più semplice… tenetene conto.
Gli script utilizzati sono da considerarsi come dei semplici esempi
e non pretendono di insegnare la programmazione shell di unix. Ci sono
molte altre possibilità e miglioramenti possibili, come per esempio
un controllo completo via email o attraverso una interfaccia web scritta
in php o python… a voi svilupparli :-)

Per approfondimenti


Posted on Mar 11, 2004 - 04:34 AM


Ricerca:


Adv:

ApplePro :
Vuoi acquistare un prodotto dalla Apple? Sei un utente Pro (cioè hai la partita IVA)? Se vuoi supportare il nostro sito, passa da qui: apple pro.