レベル1 · 不良リリース
新しいビルドが09:10にリリースされます。今月はすでに厳しく、エラーバジェットは20 %しか残っていません。デプロイの数分後、バーンレートのページが鳴ります。バジェットを守ってください。
- 終了時のエラーバジェット残り ≥ 18.5 %
- デプロイ後の平均エラー率 ≤ 0.65 %
- フリートコスト ≤ $9.50
あなたはWebサービスのオンコール担当です。インスタンス群の前にロードバランサー、データベースの前にキャッシュがあり、可用性目標は99.9 %です。モデルは毎分、待ち行列遅延、タイムアウト、キャッシュヒット、データベース負荷を教科書の式から計算し、あなたの判断のコストも計上します。
フリートの下限。引き上げるとインスタンスはすぐ起動しますが、サービス開始までには起動遅延が必要です。
利用率に対するターゲット追跡。インスタンスが起動中の間は新しいスケールアウトをしません。オフ = ちょうど最小値。
低い = 余裕が増え、コストも増えます。測定される利用率は100 %を超えられないため、飽和したフリートは一歩ずつしか増えません。
TTLが長い = ヒットは増えますが、応答は古くなりえます(平均年齢 ≈ TTL/2)。
ホットキーを6分間読み込みます(1分あたりキャッシュの+12 %)。代償としてデータベースクエリが毎秒600件増えます。
低優先度30 %(プリフェッチ、バッチ、クローラー)のうち、ロードバランサーで「後で再試行」として拒否する割合。
重い機能はリクエストごとに20 msのCPUとデータベースクエリ1回を追加します。オフ = グレースフルデグラデーション。
直近の正常なビルドを新しいフリートに再デプロイし(5分、二重課金)、その後トラフィックを切り替えます。もう一度押すと準備をやり直します。不良ビルドが稼働していないときは、お金がかかるだけです。
| バーンレート(1時間) | 0.0 × |
|---|---|
| リクエスト | 1125 req/s |
| 稼働中のインスタンス | 10 |
| 起動中のインスタンス | 0 |
| キャッシュヒット率 | 77 % |
| データベース利用率 | 19 % |
| 遮断したトラフィック | 0 % |
| フリートのコスト | 4.00 $/h |
| ここまでのコスト | 0.00 $ |
| キャッシュ応答の平均年齢 | 30 s |
| 不良ビルドのトラフィック | 0 % |
| 利用可能なレコメンデーション | 100 % |
新しいビルドが09:10にリリースされます。今月はすでに厳しく、エラーバジェットは20 %しか残っていません。デプロイの数分後、バーンレートのページが鳴ります。バジェットを守ってください。
サービスへのリンクが急速に広まっていて、今朝のどこかでトラフィックの急増が予想されます。いつ来るのか、どれほど大きいのかは誰にも分かりません。今日、新しいインスタンスは起動に8分かかります。急増が来たときに、遊休容量にお金を燃やさずに、エラーとレイテンシを低く保ってください。
昼のピークに、メンテナンススクリプトがキャッシュ全体をフラッシュします。すべてのリクエストがデータベースに向かいますが、そのデータベースは通常のヒット率85 %を前提に設計されています。データベースを過負荷にせずにサービスを復旧してください。
シミュレーターが使うすべての関係式を、出典とともに示します。前提と記された定数は例示的な校正値です。
λ(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]前提:ワーカー数、サービス時間、データベース容量、キャッシュサイズ、補充速度、価格、不良ビルドのエラー率は、中規模のWebサービスを想定した例示的な値です。N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]P(W > t) = C·e^(−(N/S − λ)·t); timeouts = P(W > 2 s); a ≥ N ⇒ failed share = 1 − N/a[3]p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]近似:サービス時間と待ち時間の分位数を足しても、その和の正確なp99にはなりません(少し高くも低くもなりえます)。リクエストはミリ秒で処理されるため、キューは各分の間は定常とみなしています。busy workers L = λ·S ⇒ utilization = λ·S / N[4]hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]前提:ワーカー数、サービス時間、データベース容量、キャッシュサイズ、補充速度、価格、不良ビルドのエラー率は、中規模のWebサービスを想定した例示的な値です。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]desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]前提:ワーカー数、サービス時間、データベース容量、キャッシュサイズ、補充速度、価格、不良ビルドのエラー率は、中規模のWebサービスを想定した例示的な値です。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 instances前提:ワーカー数、サービス時間、データベース容量、キャッシュサイズ、補充速度、価格、不良ビルドのエラー率は、中規模のWebサービスを想定した例示的な値です。乱数:シード付きのmulberry32ジェネレーター。使用する分布は一様分布、指数分布(逆CDF法)、正規分布(Box–Muller法)、ポアソン分布(Knuth法)。シードは表示され、共有できます。
教育用モデルです。運用上の判断には使用しないでください。実際の現場では、すべての定数を自社の設備とデータに合わせて校正します。