IT 운영 — 사이트 신뢰성(SRE) 라이브 모델

당신은 웹 서비스의 온콜 담당자입니다: 로드 밸런서 뒤의 인스턴스 무리, 데이터베이스 앞의 캐시, 그리고 99.9% 가용성 목표. 모델은 매분 교과서 공식으로 대기 지연, 타임아웃, 캐시 적중, 데이터베이스 부하를 계산하고, 당신의 결정에 드는 비용도 계산합니다.

배우게 될 것

시뮬레이터

0분 경과
요청 1125 · 오류율 0.00% · p99 지연 342 ms · 서비스 중 인스턴스 10 (+0) · 캐시 적중률 77% · 데이터베이스 사용률 19% · 남은 에러 버짓 (30일) 50.0%⇉1125 요청/초▶▶▶▶▶▶▶▶▶▶······························▶ 10 · ⚙ 0 · 52% · p99 342 ms서버 사용률 52%캐시 적중률 77%데이터베이스 사용률 19%⚠ 0.00% · 🔥 0.0×50%$ 4.00/h · Σ $0.00
  • 서비스 중 인스턴스
  • 부팅 중 인스턴스
  • 불량 빌드 인스턴스
  • 빈 자리
  • 들어오는 요청

조작

인스턴스 수의 하한. 올리면 즉시 띄우지만, 트래픽을 받기까지 부팅 시간이 걸립니다.

사용률 목표 추적 방식. 부팅 중인 인스턴스가 있으면 추가 확장을 하지 않습니다. 끄면 최소 인스턴스 수로 고정됩니다.

낮출수록 여유와 비용이 늘어납니다. 측정 사용률은 100%를 넘지 못해, 포화된 무리는 단계적으로만 커집니다.

TTL이 길면 적중이 늘지만, 응답이 더 오래된 데이터일 수 있습니다(평균 나이 ≈ TTL/2).

6분 동안 자주 쓰는 키를 채웁니다(분당 캐시 12%). 대가로 데이터베이스 쿼리가 초당 600개 늘어납니다.

저우선순위 30%(미리 가져오기, 배치, 크롤러) 중 로드 밸런서에서 “나중에 다시”로 돌려보낼 비율.

무거운 기능으로, 요청마다 CPU 20ms와 데이터베이스 쿼리 1개를 더합니다. 끄면 기능을 줄여 버팁니다(점진적 기능 축소).

마지막 정상 빌드를 새 인스턴스 무리에 다시 배포한 뒤(5분, 비용 두 배) 트래픽을 넘깁니다. 다시 누르면 준비가 처음부터 시작되고, 불량 빌드가 없을 때 누르면 비용만 듭니다.

지표

오류율
0.00%
정상
p99 지연
342ms
정상
남은 에러 버짓 (30일)
50.0%
정상
서버 사용률
52%
정상
소진율 (1시간)0.0 ×
요청1125 req/s
서비스 중 인스턴스10
부팅 중 인스턴스0
캐시 적중률77 %
데이터베이스 사용률19 %
차단된 트래픽0 %
인스턴스 비용4.00 $/h
누적 비용0.00 $
캐시 응답 평균 나이30 s
불량 빌드로 가는 트래픽0 %
추천 기능 제공100 %

추이

오류율: — %20.000.00

위기 시나리오

레벨 1 · 불량 배포

09시 10분에 새 빌드가 배포됩니다. 이번 달은 이미 힘들었습니다: 에러 버짓이 20%밖에 남지 않았습니다. 배포 몇 분 뒤 소진율 호출 알림이 울립니다. 버짓을 지키세요.

  • 종료 시 남은 에러 버짓 18.5% 이상
  • 배포 이후 평균 오류율 0.65% 이하
  • 인스턴스 비용 9.50달러 이하

레벨 2 · 갑작스러운 트래픽 폭주

서비스 링크가 빠르게 퍼지고 있어 오늘 오전 중 트래픽 폭주가 예상됩니다 — 언제, 얼마나 클지는 아무도 모릅니다. 오늘은 새 인스턴스가 부팅하는 데 8분이 걸립니다. 폭주가 오면, 놀고 있는 용량에 돈을 태우지 않으면서 오류와 지연을 낮게 유지하세요.

  • 평균 오류율 0.2% 이하
  • 평균 p99 지연 400ms 이하
  • 평균 차단 트래픽 5% 이하
  • 총비용 21달러 이하
  • 추천 기능 제공 시간 85% 이상

레벨 3 · 차가운 캐시

한낮 정점 시간에 유지보수 스크립트가 캐시 전체를 비웁니다. 이제 모든 요청이 데이터베이스로 가는데, 데이터베이스는 평소 85% 적중률에 맞춰 설계되었습니다. 데이터베이스를 과부하로 몰지 않고 서비스를 되살리세요.

  • 평균 오류율 1.5% 이하
  • 첫 1분 이후 데이터베이스 사용률 90% 초과 금지
  • 캐시 응답 평균 나이 평균 90초 이하
  • 총비용 9달러 이하
  • 추천 기능 제공 시간 80% 이상
  • 평균 차단 트래픽 5% 이하

근거 — 숫자 뒤의 모델

시뮬레이터가 쓰는 모든 관계식과 출처입니다. 가정으로 표시된 상수는 설명을 위한 보정값입니다.

요청은 하루 주기 곡선에 외란이 더해집니다. 분당 요청 수는 무작위(포아송, 정규 근사)이며 약간의 몰림이 있습니다.
λ(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]가정: 작업자 수, 서비스 시간, 데이터베이스 용량, 캐시 크기, 채움 속도, 가격, 불량 빌드의 오류율은 중간 규모 웹 서비스를 가정한 설명용 값입니다.
얼랑 C: M/M/N 시스템에서 요청이 빈 작업자를 기다려야 할 확률.
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
대기 시간 꼬리: t보다 오래 기다릴 확률은 지수적으로 줄어듭니다. 2초 타임아웃까지 기다린 요청은 실패하고, 용량을 넘으면 넘친 만큼 실패합니다.
P(W > t) = C·e^(−(N/S − λ)·t); timeouts = P(W > 2 s); a ≥ N ⇒ failed share = 1 − N/a[3]
서비스 시간과 대기 시간의 분위수로 구한 p99 지연.
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]근사: 서비스 시간과 대기 시간의 분위수를 더한 값은 합의 정확한 p99가 아닙니다(조금 높거나 낮을 수 있습니다). 요청이 수 밀리초면 끝나므로 대기열은 1분 안에서는 정상 상태로 봅니다.
리틀의 법칙: 바쁜 작업자 수 = 도착률 × 서비스 시간.
busy workers L = λ·S ⇒ utilization = λ·S / N[4]
TTL 캐시: 요청이 무작위일 때, 미스 한 번이 TTL 기간을 열고 그동안의 요청은 적중합니다.
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]가정: 작업자 수, 서비스 시간, 데이터베이스 용량, 캐시 크기, 채움 속도, 가격, 불량 빌드의 오류율은 중간 규모 웹 서비스를 가정한 설명용 값입니다.
SLO와 에러 버짓: 소진율은 허용된 속도보다 몇 배 빠르게 버짓을 쓰고 있는지를 말합니다.
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]
부팅 지연과 대기 시간(cooldown)이 있는 목표 추적형 오토스케일러.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]가정: 작업자 수, 서비스 시간, 데이터베이스 용량, 캐시 크기, 채움 속도, 가격, 불량 빌드의 오류율은 중간 규모 웹 서비스를 가정한 설명용 값입니다.
모델이 쓰는 그 밖의 운영 상수.
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가정: 작업자 수, 서비스 시간, 데이터베이스 용량, 캐시 크기, 채움 속도, 가격, 불량 빌드의 오류율은 중간 규모 웹 서비스를 가정한 설명용 값입니다.

난수: 시드가 고정된 mulberry32 생성기. 사용 분포 — 균등, 지수(역CDF), 정규(Box–Muller), 포아송(Knuth). 시드는 화면에 표시되고 공유됩니다.

출처

  1. Site Reliability Engineering — Ch. 3 Embracing Risk (error budgets), Ch. 4 Service Level Objectives — Beyer, Jones, Petoff, Murphy (eds.), O'Reilly, 2016
  2. The Site Reliability Workbook — Ch. 5 Alerting on SLOs (burn rate; 14.4× over 1 h = 2 % of a 30-day budget) — Beyer, Murphy, Rensin, Kawahara, Thorne (eds.), O'Reilly, 2018
  3. Teletraffic Engineering Handbook — Erlang C formula; waiting-time distribution for M/M/n, FCFS — ITU-D Study Group 2 Question 16/2 (V. B. Iversen), 2005
  4. J. D. C. Little — A Proof for the Queuing Formula: L = λW — Operations Research 9(3):383–387, 1961
  5. J. Jung, A. W. Berger, H. Balakrishnan — Modeling TTL-based Internet Caches — IEEE INFOCOM 2003, 2003
  6. 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

이 일을 하는 사람들

교육용 모델입니다 — 실제 운영 결정에 쓰지 마세요. 실제 현장은 모든 상수를 자기 장비와 데이터로 보정합니다.