Sie haben Bereitschaft für einen Webdienst: ein Lastverteiler vor einer Flotte von Instanzen, ein Cache vor einer Datenbank und ein Verfügbarkeitsziel von 99,9 %. Jede Minute berechnet das Modell Warteschlangenverzögerung, Timeouts, Cache-Treffer und Datenbanklast aus Lehrbuchformeln — und was Ihre Entscheidungen kosten.
Das lernen Sie
Warum die Latenz nahe Volllast explodiert (Erlang C) und warum Autoskalierung mit Startverzögerung immer zu spät kommt.
Wie SLOs, Fehlerbudgets und Burn-Rate-Alarme entscheiden, wann zurückgerollt wird.
Wie ein kalter Cache zum Datenbankausfall wird und welche Stellgrößen Zeit verschaffen: Abwerfen, Funktionsminderung, Aufwärmen.
Simulator
Zeit 0 min
▶Instanz bedient
⚙Instanz fährt hoch
!Instanz auf dem fehlerhaften Build
·Freier Platz
•Eingehende Anfragen
Regler
Untergrenze für die Flotte. Eine Erhöhung startet sofort Instanzen — sie brauchen trotzdem die Startverzögerung, bevor sie bedienen.
Zielwertregelung auf die Auslastung; keine neue Aufskalierung, solange noch Instanzen hochfahren. Aus = genau das Minimum.
Niedriger = mehr Reserve und mehr Kosten. Die gemessene Auslastung kann 100 % nicht überschreiten, daher wächst eine gesättigte Flotte nur schrittweise.
Längere TTL = mehr Treffer, aber Antworten können älter sein (mittleres Alter ≈ TTL/2).
Lädt 6 Minuten lang häufige Schlüssel (+12 % des Caches pro Minute) zum Preis von 600 zusätzlichen Datenbankabfragen/s.
Anteil der 30 % mit niedriger Priorität (Prefetch, Batch, Crawler), der am Lastverteiler mit „später erneut versuchen“ abgewiesen wird.
Das aufwendige Feature fügt 20 ms CPU und eine Datenbankabfrage pro Anfrage hinzu. Aus = kontrollierte Funktionsminderung.
Stellt den letzten guten Build auf einer frischen Flotte bereit (5 min, doppelt abgerechnet) und schaltet dann den Datenverkehr um. Erneutes Drücken startet die Vorbereitung neu; ohne schlechten Build im Livebetrieb kostet es nur Geld.
Kennzahlen
Fehlerrate
0,00%
normal
p99-Latenz
342ms
normal
Verbleibendes Fehlerbudget (30 Tage)
50,0%
normal
Flottenauslastung
52%
normal
Verbrauchsrate (1 h)
0,0 ×
Anfragen
1125 req/s
Bedienende Instanzen
10
Hochfahrende Instanzen
0
Cache-Trefferquote
77 %
Datenbankauslastung
19 %
Abgeworfener Datenverkehr
0 %
Flottenkosten
4,00 $/h
Bisherige Kosten
0,00 $
Mittleres Alter der gecachten Antworten
30 s
Datenverkehr auf dem fehlerhaften Build
0 %
Empfehlungen verfügbar
100 %
Verlauf
Krisenszenarien
Stufe 1 · Fehlerhaftes Release
Um 09:10 geht ein neuer Build live. Der Monat war schon holprig: Nur noch 20 % des Fehlerbudgets sind übrig. Minuten nach dem Deployment löst der Burn-Rate-Alarm aus. Schützen Sie das Budget.
Verbleibendes Fehlerbudget am Ende ≥ 18,5 %
Mittlere Fehlerrate ≤ 0,65 % nach dem Deployment
Flottenkosten ≤ 9,50 $
Stufe 2 · Besucheransturm
Ein Link zum Dienst verbreitet sich schnell, und irgendwann an diesem Morgen wird eine Verkehrsspitze erwartet – niemand weiß, wann oder wie groß. Neue Instanzen brauchen heute 8 Minuten zum Hochfahren. Wenn sie kommt, halten Sie Fehler und Latenz niedrig, ohne Geld für ungenutzte Kapazität zu verbrennen.
Mittlere Fehlerrate ≤ 0,2 %
Mittlere p99-Latenz ≤ 400 ms
Mittlerer abgeworfener Datenverkehr ≤ 5 %
Gesamtkosten ≤ 21 $
Empfehlungen zu ≥ 85 % der Zeit verfügbar
Stufe 3 · Kalter Cache
In der Mittagsspitze leert ein Wartungsskript den gesamten Cache. Jede Anfrage geht jetzt an die Datenbank, die für die übliche Trefferquote von 85 % ausgelegt war. Bringen Sie den Dienst zurück, ohne die Datenbank zu überlasten.
Mittlere Fehlerrate ≤ 1,5 %
Datenbankauslastung nach der ersten Minute nie über 90 %
Mittleres Alter der gecachten Antworten ≤ 90 s im Durchschnitt
Gesamtkosten ≤ 9 $
Empfehlungen zu ≥ 80 % der Zeit verfügbar
Mittlerer abgeworfener Datenverkehr ≤ 5 %
Grundlage — das Modell hinter den Zahlen
Jede Beziehung, die der Simulator verwendet, mit ihrer Quelle. Als Annahmen gekennzeichnete Konstanten sind anschauliche Kalibrierungen.
Anfragen folgen einer Tageskurve plus Störungen; die Zahl pro Minute ist zufällig (Poisson, Normalapproximation) mit etwas Burstiness.
λ(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]Annahme: Workerzahlen, Bedienzeiten, Datenbankkapazität, Cachegröße, Auffüllgeschwindigkeit, Preise und die Fehlerrate des fehlerhaften Builds sind Anschauungswerte für einen mittelgroßen Webdienst.
Erlang C: die Wahrscheinlichkeit, dass eine Anfrage in einem M/M/N-System auf einen freien Worker warten muss.
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
Ausläufer der Wartezeit: Die Wahrscheinlichkeit, länger als t zu warten, fällt exponentiell; Anfragen, die beim 2-s-Timeout noch warten, schlagen fehl. Jenseits der Kapazität schlägt der Überschuss fehl.
p99-Latenz aus den Quantilen von Bedienzeit und Wartezeit.
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]Näherung: Das Addieren der Quantile von Bedienzeit und Wartezeit ist nicht das exakte p99 ihrer Summe (es kann etwas zu hoch oder zu niedrig sein); die Warteschlange wird innerhalb jeder Minute als stationär behandelt, weil Anfragen Millisekunden dauern.
TTL-Cache: Bei zufälligen Anfragen startet jeder Miss eine TTL-Periode, in der Anfragen treffen.
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
Cache-Misses belasten die Datenbank; ihre Warteschlangenverzögerung verlangsamt jede Anfrage, die sie berührt, was auch die App-Worker füllt.
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]Annahme: Workerzahlen, Bedienzeiten, Datenbankkapazität, Cachegröße, Auffüllgeschwindigkeit, Preise und die Fehlerrate des fehlerhaften Builds sind Anschauungswerte für einen mittelgroßen Webdienst.
SLO und Fehlerbudget: Die Verbrauchsrate (Burn Rate) sagt, um wie viel schneller als erlaubt das Budget ausgegeben wird.
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]
Zielwert-Autoscaler mit Startverzögerung und Abkühlphase.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]Annahme: Workerzahlen, Bedienzeiten, Datenbankkapazität, Cachegröße, Auffüllgeschwindigkeit, Preise und die Fehlerrate des fehlerhaften Builds sind Anschauungswerte für einen mittelgroßen Webdienst.
Weitere vom Modell verwendete Betriebskonstanten.
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 instancesAnnahme: Workerzahlen, Bedienzeiten, Datenbankkapazität, Cachegröße, Auffüllgeschwindigkeit, Preise und die Fehlerrate des fehlerhaften Builds sind Anschauungswerte für einen mittelgroßen Webdienst.
Zufall: ein Mulberry32-Generator mit Seed; verwendete Verteilungen — gleichverteilt, exponentiell (inverse Verteilungsfunktion), normal (Box–Muller), Poisson (Knuth). Der Seed wird angezeigt und lässt sich teilen.
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