Je hebt storingsdienst voor een webdienst: een load balancer vóór een vloot instanties, een cache vóór een database en een beschikbaarheidsdoel van 99,9 %. Elke minuut berekent het model wachtrijvertraging, timeouts, cache-hits en databasebelasting uit leerboekformules — en wat jouw beslissingen kosten.
Wat je gaat leren
Waarom latentie explodeert bij bijna volledige belasting (Erlang C), en waarom autoscaling met een opstartvertraging altijd te laat komt.
Hoe SLO’s, foutbudgetten en burn-rate-alerts bepalen wanneer je moet terugdraaien.
Hoe een koude cache verandert in een database-uitval, en welke hendels tijd kopen: afknijpen, degraderen, opwarmen.
Simulator
Tijd 0 min
▶Instantie verwerkt
⚙Instantie start op
!Instantie op de slechte build
·Vrije plek
•Binnenkomende requests
Bediening
Ondergrens voor de vloot. Verhogen start meteen instanties — ze hebben nog steeds de opstartvertraging nodig voordat ze verwerken.
Target tracking op belasting; geen nieuwe opschaling zolang instanties nog opstarten. Uit = precies het minimum.
Lager = meer ruimte en meer kosten. Gemeten belasting kan niet boven 100 % komen, dus een verzadigde vloot groeit alleen stap voor stap.
Langere TTL = meer hits, maar antwoorden kunnen ouder zijn (gemiddelde leeftijd ≈ TTL/2).
Laadt hot keys gedurende 6 minuten (+12 % van de cache per minuut) ten koste van 600 extra databasequery’s/s.
Deel van de 30 % lage prioriteit (prefetch, batch, crawlers) dat bij de load balancer wordt geweigerd met “probeer het later opnieuw”.
De zware functie voegt 20 ms CPU en één databasequery per request toe. Uit = gecontroleerde degradatie.
Zet de laatste goede build uit op een verse vloot (5 min, dubbel gefactureerd) en schakelt daarna het verkeer om. Opnieuw drukken start de voorbereiding opnieuw; als er geen slechte build live is, kost het alleen geld.
Indicatoren
Foutpercentage
0,00%
normaal
p99-latentie
342ms
normaal
Foutbudget over (30 dagen)
50,0%
normaal
Belasting van de vloot
52%
normaal
Burn rate (1 h)
0,0 ×
Requests
1125 req/s
Instanties in dienst
10
Instanties die opstarten
0
Cache-hitratio
77 %
Databasebelasting
19 %
Afgeknepen verkeer
0 %
Kosten van de vloot
4,00 $/h
Kosten tot nu toe
0,00 $
Gemiddelde leeftijd van gecachete antwoorden
30 s
Verkeer op de slechte build
0 %
Aanbevelingen beschikbaar
100 %
Trend
Crisisscenario’s
Niveau 1 · Slechte release
Om 09:10 gaat een nieuwe build live. De maand is al zwaar geweest: er is nog maar 20 % van het foutbudget over. Enkele minuten na de deploy gaat de burn-rate-pagina af. Bescherm het budget.
Foutbudget over aan het einde ≥ 18,5 %
Gemiddeld foutpercentage ≤ 0,65 % na de deploy
Kosten van de vloot ≤ $9,50
Niveau 2 · Plotselinge drukte
Een link naar de dienst verspreidt zich snel en ergens vanochtend wordt een verkeerspiek verwacht — niemand weet wanneer, of hoe groot. Nieuwe instanties hebben vandaag 8 minuten nodig om te starten. Houd bij de piek fouten en latentie laag zonder geld te verbranden aan ongebruikte capaciteit.
Gemiddeld foutpercentage ≤ 0,2 %
Gemiddelde p99-latentie ≤ 400 ms
Gemiddeld afgeknepen verkeer ≤ 5 %
Totale kosten ≤ $21
Aanbevelingen beschikbaar ≥ 85 % van de tijd
Niveau 3 · Koude cache
Op de middagpiek leegt een onderhoudsscript de hele cache. Elke request gaat nu naar de database, die was gedimensioneerd op de gebruikelijke hitratio van 85 %. Krijg de dienst terug zonder de database te overbelasten.
Gemiddeld foutpercentage ≤ 1,5 %
Databasebelasting nooit boven 90 % na de eerste minuut
Gemiddelde leeftijd van gecachete antwoorden ≤ 90 s gemiddeld
Totale kosten ≤ $9
Aanbevelingen beschikbaar ≥ 80 % van de tijd
Gemiddeld afgeknepen verkeer ≤ 5 %
Grondslag — het model achter de getallen
Elk verband dat de simulator gebruikt, met bron. Constanten die als aanname zijn gemarkeerd, zijn illustratieve kalibraties.
Requests volgen een dagcurve plus verstoringen; het aantal per minuut is willekeurig (Poisson, normale benadering) met wat piekerigheid.
λ(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]Aanname: aantallen workers, servicetijden, databasecapaciteit, cachegrootte, vulsnelheid, prijzen en het foutpercentage van de slechte build zijn illustratieve waarden voor een middelgrote webdienst.
Erlang C: de kans dat een request moet wachten op een vrije worker in een M/M/N-systeem.
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
Staart van de wachttijd: de kans op langer wachten dan t daalt exponentieel; requests die bij de timeout van 2 s nog wachten, mislukken. Boven de capaciteit mislukt het teveel.
p99-latentie uit de kwantielen van servicetijd en wachttijd.
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]Benadering: het optellen van de service- en wachtkwantielen is niet de exacte p99 van hun som (die kan iets te hoog of te laag zijn); de wachtrij wordt binnen elke minuut als stabiel behandeld omdat verzoeken milliseconden duren.
Wet van Little: bezette workers = aankomstsnelheid × tijd in service.
TTL-cache: bij willekeurige requests start elke miss een TTL-periode waarin requests raak zijn.
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
Overige bedrijfsconstanten die het model gebruikt.
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]Aanname: aantallen workers, servicetijden, databasecapaciteit, cachegrootte, vulsnelheid, prijzen en het foutpercentage van de slechte build zijn illustratieve waarden voor een middelgrote webdienst.
SLO en foutbudget: de burn rate zegt hoeveel keer sneller dan toegestaan het budget wordt uitgegeven.
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]
Target-tracking-autoscaler met een opstartvertraging en een afkoelperiode.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]Aanname: aantallen workers, servicetijden, databasecapaciteit, cachegrootte, vulsnelheid, prijzen en het foutpercentage van de slechte build zijn illustratieve waarden voor een middelgrote webdienst.
Cache-misses belasten de database; de wachtrijvertraging vertraagt elke request die erbij komt, en dat vult ook de app-workers.
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 instancesAanname: aantallen workers, servicetijden, databasecapaciteit, cachegrootte, vulsnelheid, prijzen en het foutpercentage van de slechte build zijn illustratieve waarden voor een middelgrote webdienst.
Willekeur: een mulberry32-generator met seed; gebruikte verdelingen — uniform, exponentieel (inverse CDF), normaal (Box–Muller), Poisson (Knuth). De seed wordt getoond en kan worden gedeeld.
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