Anda siaga (on call) untuk layanan web: load balancer di depan armada instance, cache di depan database, dan target ketersediaan 99,9 %. Setiap menit model menghitung delay antrean, timeout, cache hit, dan beban database dari rumus buku teks — dan berapa biaya keputusan Anda.
Apa yang akan Anda pelajari
Mengapa latensi meledak mendekati utilisasi penuh (Erlang C), dan mengapa autoscaling dengan jeda boot selalu terlambat.
Bagaimana SLO, error budget, dan peringatan burn-rate menentukan kapan harus rollback.
Bagaimana cache dingin berubah menjadi gangguan database, dan kendali apa yang membeli waktu: membuang, menurunkan fitur, memanaskan.
Simulator
Waktu 0 mnt
▶Instance melayani
⚙Instance booting
!Instance pada build buruk
·Slot kosong
•Permintaan masuk
Kontrol
Batas bawah untuk armada. Menaikkannya langsung meluncurkan instance — tetapi masih butuh jeda boot sebelum melayani.
Pelacakan target pada utilisasi; tidak ada scale-out baru selama instance masih booting. Mati = tepat minimum.
Lebih rendah = lebih banyak ruang dan biaya lebih tinggi. Utilisasi terukur tidak bisa melebihi 100 %, sehingga armada jenuh tumbuh hanya langkah demi langkah.
TTL lebih panjang = lebih banyak hit, tetapi jawaban bisa lebih tua (usia rata-rata ≈ TTL/2).
Memuat kunci panas selama 6 menit (+12 % dari cache per menit) dengan biaya 600 kueri database tambahan/dtk.
Bagian dari 30 % prioritas rendah (prefetch, batch, crawler) yang ditolak di load balancer dengan „coba lagi nanti“.
Fitur berat menambah 20 ms CPU dan satu kueri database per permintaan. Mati = degradasi mulus (graceful degradation).
Men-deploy ulang build baik terakhir pada fleet baru (5 mnt, ditagih dua kali), lalu mengalihkan trafik. Menekan lagi akan mengulang persiapan; jika tidak ada build buruk yang aktif, ini hanya menghabiskan uang.
Indikator
Laju galat
0,00%
normal
Latensi p99
342ms
normal
Error budget tersisa (30 hari)
50,0%
normal
Utilisasi armada
52%
normal
Burn rate (1 jam)
0,0 ×
Permintaan
1125 req/s
Instance melayani
10
Instance sedang booting
0
Cache hit rate
77 %
Utilisasi database
19 %
Lalu lintas dibuang
0 %
Biaya armada
4,00 $/h
Biaya sejauh ini
0,00 $
Usia rata-rata jawaban ter-cache
30 s
Lalu lintas pada build buruk
0 %
Rekomendasi tersedia
100 %
Tren
Skenario krisis
Level 1 · Rilis buruk
Build baru dirilis pukul 09:10. Bulan ini sudah berat: hanya 20 % error budget tersisa. Beberapa menit setelah deploy, halaman peringatan burn-rate berbunyi. Lindungi budget.
Error budget tersisa di akhir ≥ 18,5 %
Laju galat rata-rata ≤ 0,65 % setelah deploy
Biaya armada ≤ $9,50
Level 2 · Keramaian mendadak
Tautan ke layanan menyebar cepat dan lonjakan lalu lintas diperkirakan terjadi sekitar pagi ini — tak seorang pun tahu kapan, atau seberapa besar. Instans baru butuh 8 menit untuk menyala hari ini. Saat lonjakan datang, jaga galat dan latensi tetap rendah tanpa membakar uang untuk kapasitas yang menganggur.
Laju galat rata-rata ≤ 0,2 %
Latensi p99 rata-rata ≤ 400 ms
Rata-rata lalu lintas dibuang ≤ 5 %
Total biaya ≤ $21
Rekomendasi tersedia ≥ 85 % waktu
Level 3 · Cache dingin
Pada puncak tengah hari skrip pemeliharaan mengosongkan seluruh cache. Setiap permintaan kini menuju database, yang dirancang untuk hit rate 85 % biasa. Pulihkan layanan tanpa membebani database berlebih.
Laju galat rata-rata ≤ 1,5 %
Utilisasi database tidak pernah di atas 90 % setelah menit pertama
Usia rata-rata jawaban ter-cache ≤ 90 dtk rata-rata
Total biaya ≤ $9
Rekomendasi tersedia ≥ 80 % waktu
Rata-rata lalu lintas dibuang ≤ 5 %
Dasar — model di balik angka
Setiap hubungan yang dipakai simulator, beserta sumbernya. Konstanta yang ditandai sebagai asumsi adalah kalibrasi ilustratif.
Permintaan mengikuti kurva harian ditambah gangguan; jumlah per menit acak (Poisson, aproksimasi normal) dengan sedikit 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]Asumsi: jumlah worker, waktu layanan, kapasitas database, ukuran cache, kecepatan pengisian, harga, dan laju galat build buruk adalah nilai ilustratif untuk layanan web ukuran menengah.
Erlang C: probabilitas bahwa permintaan harus menunggu worker bebas dalam sistem M/M/N.
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
Ekor waktu tunggu: peluang menunggu lebih lama dari t turun secara eksponensial; permintaan yang masih menunggu pada timeout 2 dtk gagal. Di atas kapasitas, kelebihannya gagal.
Latensi p99 dari kuantil waktu layanan dan waktu tunggu.
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]Pendekatan: menjumlahkan kuantil layanan dan antrean bukan p99 persis dari jumlah keduanya (bisa sedikit tinggi atau rendah); antrean dianggap stabil dalam setiap menit karena permintaan berlangsung dalam milidetik.
Hukum Little: worker sibuk = laju kedatangan × waktu dalam layanan.
Cache TTL: dengan permintaan acak, setiap miss memulai periode TTL di mana permintaan mengenai (hit).
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
Miss cache membebani database; delay antreannya memperlambat setiap permintaan yang menyentuhnya, yang juga mengisi worker aplikasi.
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]Asumsi: jumlah worker, waktu layanan, kapasitas database, ukuran cache, kecepatan pengisian, harga, dan laju galat build buruk adalah nilai ilustratif untuk layanan web ukuran menengah.
SLO dan error budget: burn rate menunjukkan berapa kali lebih cepat dari yang diizinkan budget dihabiskan.
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]
Autoscaler pelacak target dengan jeda boot dan cooldown.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]Asumsi: jumlah worker, waktu layanan, kapasitas database, ukuran cache, kecepatan pengisian, harga, dan laju galat build buruk adalah nilai ilustratif untuk layanan web ukuran menengah.
Konstanta operasi lain yang dipakai model.
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 instancesAsumsi: jumlah worker, waktu layanan, kapasitas database, ukuran cache, kecepatan pengisian, harga, dan laju galat build buruk adalah nilai ilustratif untuk layanan web ukuran menengah.
Keacakan: generator mulberry32 ber-seed; distribusi yang dipakai — seragam, eksponensial (CDF invers), normal (Box–Muller), Poisson (Knuth). Seed ditampilkan dan dapat dibagikan.
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