7.9 KiB
The power of two choices (continua)
Modello del supermarket
Il modello del supermarket e' un modello che illustra il vantaggio di scegliere 2 code a caso contro la scelta di una sola coda. Le code sono considerate code MM1. Tra la scelta di una coda e la scelta di due code (vedi lesson11 per equazioni), si nota:
- Con SQ(1), ossia con la singola coda scelta a caso, l'arrivo di clienti sulle code causa ritardi esponenziali
- Con SQ(2), i ritardi sono abbattuti di un fattore log (logaritmico)
- Con SQ(d), d>2, i ritardi sono minori ma il guadagno e' minimo rispetto a SQ(2).
Dimostrazione del vantaggio delle due scelte
Siano:
lambda = rate coefficient
u = tempo di smaltimento delle code
n = totale code
d = totale code che posso scegliere (si considera 1, 2)
mi(t) = numero di code con almeno 'i' clienti al tempo 't'. // devono essere minori in SQ(2) rispetto a SQ(1)
Si(t) = mi(t) / n; //frazione di code con almeno 'i' clienti al tempo 't', o mi(t) normalizzata
-
Supponiamo che il numero di code del sistema tenda a infinito. Questo fa si che il sistema abbia comportamenti deterministici, secondo la legge dei grandi numeri.
-
Questo da luogo a un'equazione differenziale ordinaria, dove la randomicita' del sistema scompare:
d[Si(t)]/dt = lambda*(S[i-1, d](t) - S[i,d](t)) - u*(Si(t) - S[i+1](t)) // per la normalizzata
d[mi(t)]/dt = n*lambda*(S[i-1, d](t) - S[i,d](t)) - n*u*(Si(t) - S[i+1](t)) // per mi(t), basta moltiplicare la normalizzata per n
NOTA: la d all'interno dei parametri di Si e' elevamento a potenza
Dimostrazione di validita' dell'ODE
La ODE e' divisa in due termini:
-
n*u*(Si(t) - S[i+1](t))
e' il numero di code coni
clienti in attesa, moltiplicato peru
che e' il rate di servizio. Questo termine e' il rate con cui la derivata sul tempo di mi(t) diminuisce. -
n*lambda*(S[i-1, d](t) - S[i,d](t))
rappresenta l'unico evento in cui d[mi] aumenta: quando un cliente nuovo si uniscea una coda che ha esattamentei-1
clienti. (quindi mi(t)++). Questo avviene con probabilita':
S[i-1, d](t) - S[i,d](t)
- Infatti, la precedente probabilita' esclude
S[i,d](t)
, che e' il caso in cui viene scelta una coda con gia'i
clienti in attesa, che non vuole essere considerata nella differenziale relativa ami(t)
.
Risoluzione
- Consideriamo l'ODE per la differenziale normalizzata (dividendo quindi per n):
d[Si(t)]/dt = lambda*(S[i-1, d](t) - S[i,d](t)) - u*(Si(t) - S[i+1](t)) // per la normalizzata
-
Consideriamo, per semplicita',
u = 1
(non e' restrittivo). -
Vogliamo quindi raggiungere un equilibrio (valori stazionari del sistema), ossia quelli in cui la variazione di Si(t) e' 0 (pertanto
d[Si(t)]/dt = 0
). Questo comporta:
0 = lambda*(S[i-1,d] - S[i,d]) - (S[i] - S[i+1])
-
Dove
0 <= S[i] <= 1
. -
Notiamo ora che la frazione di code con 0 clienti dentro e' 1 (non ci sono code con meno di 0 clienti in attesa), quindi
S[0] = 1
-
Da questo risultato, dobbiamo trovare tutti gli altri S[i], che pero' ci presentano il problema di dipendere sia da S[i-1] sia da S[i+1].
-
Possiamo affermare:
S[i] = lambda*S[i-1,d] // che e' una geometrica troncata, riscrivibile come la soluzione sotto riportata.
- Pertanto la soluzione:
S[i] = lambda^((d^i-1)/(d-1))
- Che e' una double-exponential decrease (perche' l'esponenziale
d...
e' elevato ai
). Dato che lambda e' sempre compreso tra 0 e 1 e asintotico a 1, il doppio esponenziale fa si che piu' alto e'i
, piu' il numero di code con almenoi
elementi e' esponenzialmente piccolo.
Considerazioni
In base alla soluzione ottenuta, la SQ(1) diventa:
S0 = 1
S1 = lambda
S2 = lambda^2
S3 = lambda^3
etc...
Quindi, SQ(1) e' un exponential decrease, mentre SQ(2) e' double exponential decrease.
TL;DR
Per dimostrare la potenza delle due scelte, abbiamo utilizzato una mean-field approximation (n a infinito) per eliminare le randomicita', ottenendo una ODE che rappresenta la variazione del numero di code con i
clienti al loro interno.
Per trovare una soluzione alla ODE, abbiamo utilizzato la soluzione di equilibrio, che implica la derivata nulla (il sistema non ha cambiamenti).
Notiamo quindi la presenza di una soluzione unica, che affermiamo risolvere l'equazione di equilibrio. Da questa approssimazione otteniamo una soluzione finale come double exponential decrease che e' un grado esponenziale piu' alto rispetto alla SQ(1), in cui la decrescita e' solo exponential decrease.
Un'osservazione sul load balancing
Il tema del load balancing e' molto attuale, infatti per una server farm con un alto numero di server (10000, 100000...) si discute ancora di versioni migliorate della potenza delle due scelte per garantire un load balancing quando lo stato intero del sistema e' troppo grande da ottenere in real time.
C'e' un'alternativa con bassissimo overhead alla potenza delle due scelte, ed e' la seguente:
- Ogni server scarico viene aggiunto a una pool di server vuoti che gestiscono le nuove richieste in arrivo. Questo sistema funziona fintanto che ho disponibilita' di server scarichi, cosa che per un numero molto elevato di server e' molto probabile.
Questo risolve il load balancing problem in maniera semplice, ma funziona solo con un numero elevato di server. E' anche vero che con un numero minore di server, lo stato delle code in tempo reale e' facilmente ottenibile.
Instradamento randomizzato a due hop
Analizziamo il caso in cui una rete deve essere:
- robusta a cambiamenti di traffico (no sovraccarico)
- con minimo overhead (di aggiornamenti di routing al variare del traffico)
L'obbiettivo e' quindi di trovare i miglior hop per i pacchetti da un link in ingresso a un link in uscita.
Caso 1: matrice di traffico
Voglio creare una matrice di traffico, rappresentando un grafo pesato in forma matriciale. La matrice di traffico e' pero' difficile (se non impossibile) da stimare.
(vedi slides per matrice esempio)
Sappiamo pero' che un nodo chiave (i.e. nodo regionale) rappresentera' un'intera riga (o colonna) della matrice, costruendo quello che si chiama nodo aggregato. Possiamo utilizzare una tecnica chiamata Valiant load Balancing.
Valiant Load Balancing
Ogni pacchetto che entra nella rete e':
- inviato a un nodo intermediario scelto a caso
- inviato in modo diretto dal nodo intermediario alla destinazione.
Pertanto il passaggio 1 non e' deterministico, mentre il secondo si. Questo funziona bene se la rete considerata (di nodi aggregati) e' completamente connessa, oppure l'algoritmo di valiant load balancing va mappato su una rete che non sia completamente connessa.
-
Supponiamo che tutti i nodi aggregati abbiano banda
r
ai propri sottonodi, dovranno quindi avere una capacita' dir
anche su tutti i link che collegano i nodi aggregati (vedi slides), se non utilizziamo il valiant load balancing. -
Con il valiant load balancing, ottengo:
B(link) = 2*r / (N-1) // ciascuno dei contributi di r sul link e' al piu' r/N-1, perche' e' spalmato su N nodi
Dove B e' la banda richiesta da un link e N e' il numero di nodi.
Discussione: randomizzazione (approfondimento)
(vedi articolo su slides)
Indirezione
Butler Lampson scrisse che ogni problema in CS puo' essere risolto aggiungendo un altro livello di indirezione. L'indirezione e' il passaggio da un'entita' intermedia per raggiungere una destinazione, che pero' potrebbe essere raggiunta direttamente.
E' un meccanismo elegante che risolve molti problemi.
Indirezione e multicast
Il multicast e' applicazione diretta del principio di indirezione, in quanto le sorgenti dei pacchetti spediscono semplicemente al gruppo multicast, che sono l'ente intermedio che si occupa di smistare e distribuire i pacchetti. Le destinazioni (ricevitori) si devono semplicemente registrare al gruppo multicast (IGMP soft-state).