Dežurni ste za web servis: balanser opterećenja ispred flote instanci, predmemorija ispred baze podataka i cilj dostupnosti od 99,9 %. Svake minute model iz udžbeničkih formula računa kašnjenje u redu, istekla čekanja, pogotke predmemorije i opterećenje baze, te što vaše odluke koštaju.
Što ćete naučiti
Zašto latencija eksplodira blizu pune iskorištenosti (Erlang C) i zašto automatsko skaliranje s kašnjenjem pokretanja uvijek stigne prekasno.
Kako SLO-ovi, proračuni grešaka i upozorenja o brzini trošenja odlučuju kada vratiti izdanje.
Kako hladna predmemorija postaje ispad baze podataka i koje poluge kupuju vrijeme: odbacivanje, degradacija, zagrijavanje.
Simulator
Vrijeme 0 min
▶Instanca poslužuje
⚙Instanca se pokreće
!Instanca na lošoj verziji
·Slobodno mjesto
•Dolazni zahtjevi
Kontrole
Donja granica flote. Podizanje odmah pokreće instance, ali im ipak treba kašnjenje pokretanja prije posluživanja.
Praćenje ciljne iskorištenosti; nema novog povećanja dok se instance još pokreću. Isključeno = točno minimum.
Niže = više rezerve i veći trošak. Izmjerena iskorištenost ne može prijeći 100 %, pa zasićena flota raste samo korak po korak.
Dulji TTL = više pogodaka, ali odgovori mogu biti stariji (prosječna starost ≈ TTL/2).
Učitava često korištene ključeve 6 minuta (+12 % predmemorije po minuti) uz cijenu od 600 dodatnih upita bazi u sekundi.
Udio od 30 % prometa niskog prioriteta (predučitavanje, skupna obrada, crawleri) koji balanser opterećenja odbija porukom „pokušajte kasnije”.
Zahtjevna značajka dodaje 20 ms procesora i jedan upit bazi po zahtjevu. Isključeno = postupna degradacija.
Ponovno postavlja zadnju ispravnu verziju na svježu flotu (5 min, naplaćuje se dvaput), a zatim prebacuje promet. Ponovni pritisak ponovno pokreće pripremu; ako nijedna loša verzija nije aktivna, samo košta novca.
Pokazatelji
Stopa grešaka
0,00%
normalno
p99 latencija
342ms
normalno
Preostali proračun grešaka (30 dana)
50,0%
normalno
Iskorištenost flote
52%
normalno
Brzina trošenja (1 h)
0,0 ×
Zahtjevi
1125 req/s
Instance koje poslužuju
10
Instance se pokreću
0
Stopa pogodaka predmemorije
77 %
Iskorištenost baze podataka
19 %
Odbačen promet
0 %
Trošak flote
4,00 $/h
Dosadašnji trošak
0,00 $
Prosječna starost odgovora u predmemoriji
30 s
Promet na lošoj verziji
0 %
Preporuke dostupne
100 %
Trend
Krizni scenariji
Razina 1 · Loše izdanje
Nova verzija izlazi u 09:10. Mjesec je već bio težak: preostalo je samo 20 % proračuna grešaka. Nekoliko minuta nakon uvođenja oglašava se upozorenje o brzini trošenja. Zaštitite proračun.
Preostali proračun grešaka na kraju ≥ 18,5 %
Prosječna stopa grešaka ≤ 0,65 % nakon uvođenja
Trošak flote ≤ 9,50 $
Razina 2 · Nagli naval posjetitelja
Poveznica na uslugu brzo se širi i očekuje se nalet prometa negdje ovo jutro — nitko ne zna kada ni koliko velik. Nove instance danas trebaju 8 minuta za pokretanje. Kad nalet stigne, držite pogreške i latenciju niskima bez bacanja novca na neiskorišteni kapacitet.
Prosječna stopa grešaka ≤ 0,2 %
Prosječna p99 latencija ≤ 400 ms
Prosječno odbačen promet ≤ 5 %
Ukupni trošak ≤ 21 $
Preporuke dostupne ≥ 85 % vremena
Razina 3 · Hladna predmemorija
U podnevnom vrhuncu skripta za održavanje briše cijelu predmemoriju. Svaki zahtjev sada ide u bazu, koja je dimenzionirana za uobičajenih 85 % pogodaka. Vratite servis, a da ne preopteretite bazu.
Prosječna stopa grešaka ≤ 1,5 %
Iskorištenost baze nikad iznad 90 % nakon prve minute
Prosječna starost odgovora u predmemoriji ≤ 90 s u prosjeku
Ukupni trošak ≤ 9 $
Preporuke dostupne ≥ 80 % vremena
Prosječno odbačen promet ≤ 5 %
Osnova: model iza brojeva
Svaki odnos koji simulator koristi, s izvorom. Konstante označene kao pretpostavke ilustrativne su kalibracije.
Zahtjevi slijede dnevnu krivulju plus poremećaje; broj po minuti je nasumičan (Poisson, normalna aproksimacija) uz malo naletnosti.
λ(t) = base × (1 + 0.25·sin(2π(t + clock − 6 h)/24 h)) × surge(t), clock = time of day at the start (peak at 12:00); count/min ≈ N(60λ, √(60λ)) × (1 + N(0, 0.02))[6]Pretpostavka: broj radnika, vremena posluživanja, kapacitet baze, veličina predmemorije, brzina punjenja, cijene i stopa grešaka loše verzije ilustrativne su vrijednosti za web servis srednje veličine.
Erlang C: vjerojatnost da zahtjev mora čekati slobodnog radnika u sustavu M/M/N.
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
Rep vremena čekanja: vjerojatnost čekanja dulje od t eksponencijalno pada; zahtjevi koji još čekaju pri isteku od 2 s ne uspijevaju. Iznad kapaciteta višak ne uspijeva.
p99 latencija iz kvantila vremena posluživanja i vremena čekanja.
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]Aproksimacija: zbrajanje kvantila usluge i čekanja nije točan p99 njihova zbroja (može biti malo viši ili niži); red se unutar svake minute tretira kao stabilan jer zahtjevi traju milisekunde.
Littleov zakon: zauzeti radnici = brzina dolazaka × vrijeme posluživanja.
TTL predmemorija: uz nasumične zahtjeve svaki promašaj pokreće TTL razdoblje tijekom kojeg zahtjevi pogađaju.
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
Promašaji predmemorije opterećuju bazu; njezino čekanje u redu usporava svaki zahtjev koji je dotakne, što ujedno puni radnike aplikacije.
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]Pretpostavka: broj radnika, vremena posluživanja, kapacitet baze, veličina predmemorije, brzina punjenja, cijene i stopa grešaka loše verzije ilustrativne su vrijednosti za web servis srednje veličine.
SLO i proračun grešaka: brzina trošenja kaže koliko puta brže od dopuštenog se proračun troši.
budget = 1 − SLO = 0.1 %; burn = error rate / 0.1 %; Δbudget per min = burn / 43,200; burn (1 h) = mean error rate over the last 60 min / 0.1 % (window pre-filled with the opening minute)[1][2]
Automatski skalirač s praćenjem cilja, kašnjenjem pokretanja i vremenom mirovanja.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]Pretpostavka: broj radnika, vremena posluživanja, kapacitet baze, veličina predmemorije, brzina punjenja, cijene i stopa grešaka loše verzije ilustrativne su vrijednosti za web servis srednje veličine.
Ostale pogonske konstante koje model koristi.
16 workers/instance · app time 50 ms (+20 ms and +1 query with the feature on) · 2 queries/request · DB 4,000 queries/s · 20,000 hot objects · cache refill τ = 30 min (slower while the DB is saturated) · warm-up job +12 %/min for 6 min, +600 queries/s · timeout 2 s · 30 % low-priority traffic · bad build +5 % errors, ×1.25 CPU · rollback 5 min · $0.40 per instance-hour · scale-in by ≤ 20 % of the fleet after 10 quiet minutes · up to 40 instancesPretpostavka: broj radnika, vremena posluživanja, kapacitet baze, veličina predmemorije, brzina punjenja, cijene i stopa grešaka loše verzije ilustrativne su vrijednosti za web servis srednje veličine.
Slučajnost: seedirani generator mulberry32; korištene razdiobe: uniformna, eksponencijalna (inverzna CDF), normalna (Box–Muller), Poissonova (Knuth). Seed se prikazuje i može se dijeliti.
M. Harchol-Balter — Performance Modeling and Design of Computer Systems: Queueing Theory in Action (M/M/k, server farms, capacity provisioning) — Cambridge University Press, 2013