8.4 KiB
Randomizzazione nelle reti
Active Queue Management (continua)
Drop tail policy: queue FIFO, pacchetti in eccesso scartati, non efficace: crea latenza (code nei router) e perdite burst, con rischio di sincronizzazione delle connessioni TCP e successiva perdita di throughput.
Risoluzione dei problemi di Drop Tail
Random Early Detection (RED)
Scarto casuale in anticipo. I pacchetti sono accettati o scartati prima di entrare nella coda, con una certa probabilita', dipendente dallo stato attuale (lunghezza) della coda. E' uno scarto probabilistico, ogni flusso ha lo stesso tasso di perdita. Questo crea:
- Transizioni piu' morbide da nessuna perdita a burst loss
- Non uccide i flussi a tasso basso (come succede con drop tail)
- Evita la sincronizzazione degli eventi di perdita percepiti dalle sorgenti. I cicli di perdita seguiti da basso carico non sono piu' presenti.
- Problema: picchi di traffico (burst) penalizzati. Per questo i pacchetti non sono scartati con una funzione della lunghezza istantanea, ma mantenere una media della lunghezza. La media e' mantenuta con la tecnica di media mobile esponenziale (Exponentially Weighted Moving Average) [EWMA].
In RED, l'applicazione di EWMA consente di stabilire delle fasce di comportamento:
- No drop: se la coda e' in questo range, nessun pacchetto viene droppato
- Probabilistic Early Drop (fascia attorno ai valori medi della lunghezza della coda)
- Forced Drop (coda troppo lunga: pacchetti droppati)
(vedi slides per probability drop graph e grafico RED) I vantaggi di RED rispetto a Drop-Tail sono in realta' poco significativi. E' quindi implementato nei router, ma pochissimo utilizzato, a causa dei sostantivi svantaggi.
- Svantaggi di RED: complessita' di EWMA e RED rende difficile adattare i parametri (5 parametri, vedi drop graph) all'utilizzo ottimale, che dipende dal tipo di traffico (durata della connessione, carico, etc).
Uno svantaggio inoltre e' il jump da maxp a 100% nel probability drop graph, che si e' migliorato utilizzando il Gentle RED (invece di saltare, transizione lineare ripida.
EWMA
Filtro passa basso: trasforma i picchi in variazioni minori (smoother)
L = lunghezza attuale (vera) Lmobile = lunghezza mobile L(n-1) = valori precedenti di L a = parametro arbitrariamente vicino a 0 (L molto maggiore), o vicino a 1 (L(n-1) molto maggiore)
Lmobile = a*L(n-1) + (1-a)*L
- Vantaggi: evita di penalizzare i burst di traffico eccessivamente, ma reagisce ai cambiamenti su scala di tempo piu' lunga (in quanto sudden changes hanno un peso minore.
Approccio alternativo a RED, real-time
In applicazioni real-time (telefonia, video...) e' stato proposto un approccio di drop-head (invece di drop-tail) per favorire i pacchetti nuovi (in arrivo) rispetto a quelli vecchi (rimasti piu' a lungo in coda).
BitTorrent
Protocollo P2P, 2002, molto usato (cacheLogic: 35% di internet totale). Fa uso estensivo della randomizzazione.
- Pensato per grandi files
- Divisione di files in piccole parti (pezzi da 256KB, a sua volta suddiviso in blocchi da 16KB).
- Pensato per utilizzare la capacita' di upload dei peers, che si suppone siano collegati in numero efficace ad ogni momento. Piu' peer, piu' banda aggregata.
Costruisce uno swarm (torrent) per ogni file, in cui gli utenti si aiutano per scaricare il file. Essendo il file spezzettato (in pezzi da 256KB, a sua volta suddiviso in blocchi da 16KB).
Nomenclatura:
- seed: peer che ha in locale (e in condivisione) l'intero file
- leech: peer che ha in locale parti del file
- tracker: server di raccoglimento dei dati di seeders e leechers. Ogni nuovo peer utilizza un file .torrent, che contiene l'IP del tracker, di modo che il nuovo peer ottenga una lista di peer (peerset). Il tracker rende il sistema attaccabile: senza di esso, non funziona il protocollo.
- peerset: lista di peer distribuita da un tracker. Inizialmente e' casuale, formata da 50 peer. Prima fonte di randomizzazione del sistema. 50 per garantire che lo swarm sia sempre connesso, mai partizionato. (Grafi casuali).
- tit-for-tat: upload verso il peer da cui ho maggiormente scaricato durante gli ultimi 30 secondi, per ogni 4 peer. Questo favorisce i seeders e penalizza i freeriders (che si connettono per scaricare e poi lasciano lo swarm). Piu' upload, piu' peer rimangono connessi.
- rarest-first: priorita' di invio al pezzo piu' raro tra quelli posseduti dai vicini. La rarita' dei pezzi e' stabilita scambiando con i 4 peer delle bitmap che indicano i pezzi posseduti dai vicini. Questo permette al sistema di utilizzare tutta la capacita' del servizio.
Funzionamento
-
Il nuovo peer sceglie 4 peer a caso dal peerset iniziale. Altra fonte di randomizzazione.
-
Il nuovo peer inizia uno scambio di chunks con i 4 peer scelti.
-
Ogni 30 secondi, il peer che seeda di meno viene escluso e un altro peer viene scelto. (tit-for-tat).
Selezione dei chunks (dettagli)
All'inizio, il nuovo peer scarica chunks casualmente. Questo per ottenere pezzi facilmente scambiabili, perche' rarest first rende l'inizio del download molto lento. Dopo aver ottenuto 4 pezzi, rarest first comincia. Inoltre, i pezzi unici dai seed vanno scaricati (per renderli piu' comuni nei leech).
- Fase fine-del-gioco: Problema basato sull'osservazione empirica (non dimostrabile). Alla fine del download, il tempo di scaricamento aumenta (ultimi pezzi sono i piu' rari). Per questo le ultime richieste vengono fatte non solo ai 4 peer scelti, ma a tutto il peerset, per massimizzare lo scaricamento dei blocchi critici.
Anche facendo richiesta a tutto il peerset, il problema dei pezzi critici non e' completamente risolto. Questo anche perche' i peer che ottengono tutti i pezzi critici potrebbero uscire dallo swarm. Per questo motivo, quasi tutti i client incoraggiano gli utenti a restare attivi (diventare seed) dopo lo scaricamento dei files (rimanendo spesso attivi in background). Un'altra soluzione e' il network coding, che invece di scaricare pezzi, scarica una combinazione lineare di pezzi (es. XOR di alcuni pezzi). Questo crea un mescolamento di chunks, che e' pero' invertibile (posso ottenere i pezzi veri a partire da quelli mescolati). Questo rende i pezzi rari meno frequenti, e quindi piu' facilmente scaricati. Introduce pero' troppa complessita', e quindi non e' utilizzata.
Selezione dei peers (dettagli)
Un set di 4 peer unchoked.
- Ogni 30 secondi si scarta il peer con il piu' basso tasso di download, e si fa unchoke id un peer casuale (optimistic unchoking).
Questo ha molti vantaggi, tra cui:
- load balancing tra i peers. (permette di sfruttare meglio la capacita' di upload aggregata nel sistema).
- permette l'ingresso di nuovi client / peers
- mantiene la rete connessa, dato che ogni peer ha probabilita' non nulla di interagire con un altro peer.
Randomizzazione e Load balancing
La potenza delle due scelte (power of two choices)
Il problema del bilanciamento del carico e' dato dalla difficolta', posti piu' server che mi offrono un servizio, di scegliere in quale coda entrare (e quindi quale server utilizzare).
Approcci:
- Random - scelta casuale
- Join shortest queue (SQ): ottimale, ma non si puo' conoscere lo stato di tutte le code del sistema formato da piu' server, quindi non posso scegliere una coda in base al numero di peer in coda (non posso scegliere la coda piu' corta).
- SQ(d): una variante di Join shortest queue che estrae
d
code a caso, ottiene solo lo stato di quelled
code ed entra in quella piu' corta. Questo e' di solito utilizzato cond=2
, che rispetto a random, diminuisce la latenza di un fattorelog(n)
. Aumentando d>2 la latenza diminuisce solo di un fattore costante, che non e' particolarmente vantaggioso. (vedi slides per esempio balls and bins).
Supermarket Model: dimostrazione delle due scelte
Il modello del supermercato (vedi slides) mostra una situazione di code di arrivo multiple in cui i clienti devono scegliere in che coda andare. Utile per dimostrare la complessita' della potenza delle due scelte.
- Ipotesi:
- Rate of arrival = Poisson random variable
- Exponential service times
Td = ritardo atteso nel caso di d
scelte (da minimizzare)
n = numero di server
lambda = rate coefficient
u = tempo di smaltimento delle code
n*u > n*lambda
Risultati:
SQ(1) = T1 = 1 / (1/(u-lambda))
SQ(d) = Td = log(T1) / log(d), d > 1