L = λ × W
L'equazione più utile nella pianificazione della capacità
Per qualsiasi coda stabile, indipendentemente dalla sua struttura interna: L = λ × W, dove:
- L = numero medio di elementi nel sistema (in lavorazione o in attesa)
- λ (lambda) = tasso medio di arrivo (elementi per unità di tempo)
- W = tempo medio che ogni elemento trascorre nel sistema
La lettura geometrica: tracciare λ su un asse e W sull'altro. Il prodotto L è l'area del rettangolo che formano. La pianificazione della capacità si trova all'interno di questo rettangolo.
Perché è importante: qualsiasi due delle tre quantità determinano la terza. Misurando il throughput e la latenza, si conosce l'occupazione. Misurando l'occupazione e il throughput, si conosce la latenza. La legge è robusta: si applica a richieste web, tavoli di ristoranti, code di supermercati e pipeline CPU senza modifiche.
Tre esempi concreti:
- Un servizio web gestisce 200 req/s con una latenza media di 50 ms (0,05 s). L = 200 × 0,05 = 10 richieste in volo.
- Un caffè serve 60 clienti/ora con un tempo medio di permanenza di 15 minuti (0,25 h). L = 60 × 0,25 = 15 clienti all'interno.
- Un pool di backend gestisce 1500 req/s con una latenza media di 200 ms (0,2 s). L = 1500 × 0,2 = 300 richieste in volo.
Implicazione per le dimensioni: il numero di worker / thread / connessioni di un livello deve essere almeno pari a L per tenere il passo. Qualsiasi valore inferiore comporta la crescita della coda.
Perché la latenza esplode oltre l'80% di utilizzo
La curva più importante nelle operazioni
Traccia l'utilizzo sull'asse x (dal 0% al 100%) e il tempo di attesa medio sull'asse y. La forma è una delle curve più significative nella pianificazione della capacità.
Il modello di code M/M/1: per un sistema con arrivi di Poisson (casuali) e tempi di servizio esponenziali (casuali), il tempo di attesa medio è:
W_q = ρ / (μ × (1 - ρ))
dove ρ è l'utilizzo (da 0 a 1) e μ è il tasso di servizio.
La forma della curva:
- A ρ = 0,5 (50% di utilizzo), il tempo di attesa è piccolo (1 tempo di servizio).
- A ρ = 0,7 (70% di utilizzo), il tempo di attesa è di circa 2,3 tempi di servizio.
- A ρ = 0,8 (80% di utilizzo), il tempo di attesa è di circa 4 tempi di servizio.
- A ρ = 0,9 (90% di utilizzo), il tempo di attesa è di circa 9 tempi di servizio.
- A ρ = 0,95 (95% di utilizzo), il tempo di attesa è di circa 19 tempi di servizio.
- A ρ = 1,0 (100% di utilizzo), il tempo di attesa è infinito.
Il punto di ginocchio: intorno all'80% di utilizzo, la curva piega bruscamente. Sotto il punto di ginocchio, la capacità è confortevole; sopra, la latenza cresce più rapidamente dell'utilizzo.
Lettura pratica: puntare a un utilizzo del 70% per lo stato stazionario, mai al 100%. Il 30% di "margine" non è uno spreco; è il prezzo da pagare per una latenza limitata.
Dimensionamento oltre il punto di ginocchia
Due scenari:
Scenario A: 10 repliche che operano al 60% di CPU. Latenza p99 = 100 ms.
Scenario B: stessa flotta che opera al 90% di CPU a causa della crescita del traffico. p99 = 600 ms.
Stessa flotta, stesso codice, è cambiata solo l'utilizzazione.
Dimensionamento e Trigger insieme
Sintesi
Ora puoi applicare la Legge di Little come un rettangolo, leggere la curva di code e il suo punto di ginocchio, e collegare entrambi alle decisioni sulla capacità.
Applica entrambi.
Un livello backend gestisce 2.000 req/s con una latenza media di 50 ms per replica, con una capacità di 80 req/s al 70% di CPU. Fattore di picco 2x; si desidera sopravvivere a 3 guasti simultanei di replica.
Note Compagne
Note Compagne
Questa lezione di geometria ricalca la lezione principale Scalabilità Orizzontale Senza Stato come geometria quantitativa.
Il prossimo compagno, geometry_of_ingress_egress_separation, ricalca la separazione del confine di rete come grafo bipartito con un vertice di taglio che la separazione rimuove.
Ben fatto.