Operaciones de TI: fiabilidad de sitio Modelo en vivo

Estás de guardia de un servicio web: un balanceador de carga delante de una flota de instancias, una caché delante de una base de datos y un objetivo de disponibilidad del 99,9 %. Cada minuto el modelo calcula el retraso de cola, los tiempos límite, los aciertos de caché y la carga de la base de datos con fórmulas de manual, y lo que cuestan tus decisiones.

Qué aprenderás

Simulador

Tiempo 0 min
Peticiones 1125 · Tasa de errores 0.00% · Latencia p99 342 ms · Instancias atendiendo 10 (+0) · Tasa de aciertos de caché 77% · Utilización de la base de datos 19% · Presupuesto de errores restante (30 días) 50.0%⇉1125 peticiones/s▶▶▶▶▶▶▶▶▶▶······························▶ 10 · ⚙ 0 · 52% · p99 342 msUtilización de la flota 52%Tasa de aciertos de caché 77%Utilización de la base de datos 19%⚠ 0.00% · 🔥 0.0×50%$ 4.00/h · Σ $0.00
  • Instancia atendiendo
  • Instancia arrancando
  • Instancia en la versión defectuosa
  • Hueco libre
  • Peticiones entrantes

Controles

Suelo de la flota. Subirlo lanza instancias al instante, pero aún necesitan el retraso de arranque antes de atender.

Seguimiento de objetivo sobre la utilización; sin nuevo escalado horizontal mientras haya instancias arrancando. Apagado = exactamente el mínimo.

Más bajo = más margen y más coste. La utilización medida no puede superar el 100 %, así que una flota saturada solo crece paso a paso.

TTL más largo = más aciertos, pero las respuestas pueden ser más antiguas (edad media ≈ TTL/2).

Carga las claves más usadas durante 6 minutos (+12 % de la caché por minuto) al precio de 600 consultas extra por segundo a la base de datos.

Parte del 30 % de baja prioridad (precarga, lotes, rastreadores) rechazada en el balanceador de carga con «reintentar más tarde».

La función pesada añade 20 ms de CPU y una consulta a la base de datos por petición. Apagado = degradación controlada.

Vuelve a desplegar la última versión buena en una flota nueva (5 min, se factura dos veces) y luego cambia el tráfico. Presionar de nuevo reinicia la preparación; sin una versión mala en producción, solo cuesta dinero.

Indicadores

Tasa de errores
0.00%
normal
Latencia p99
342ms
normal
Presupuesto de errores restante (30 días)
50.0%
normal
Utilización de la flota
52%
normal
Tasa de consumo (1 h)0.0 ×
Peticiones1125 req/s
Instancias atendiendo10
Instancias arrancando0
Tasa de aciertos de caché77 %
Utilización de la base de datos19 %
Tráfico descartado0 %
Coste de la flota4.00 $/h
Coste hasta ahora0.00 $
Edad media de las respuestas en caché30 s
Tráfico en la versión defectuosa0 %
Recomendaciones disponibles100 %

Tendencia

Tasa de errores: — %20.000.00

Escenarios de crisis

Nivel 1 · Versión defectuosa

Una versión nueva sale a las 09:10. El mes ya ha sido duro: solo queda el 20 % del presupuesto de errores. Minutos después del despliegue salta la alerta de tasa de consumo. Protege el presupuesto.

  • Presupuesto de errores restante al final ≥ 18,5 %
  • Tasa de errores media ≤ 0,65 % tras el despliegue
  • Coste de la flota ≤ 9,50 $

Nivel 2 · Avalancha de visitas

Un enlace al servicio se está difundiendo rápido y se espera un pico de tráfico en algún momento de esta mañana: nadie sabe cuándo ni de qué tamaño. Hoy las instancias nuevas tardan 8 minutos en arrancar. Cuando llegue, mantén bajos los errores y la latencia sin quemar dinero en capacidad ociosa.

  • Tasa de errores media ≤ 0,2 %
  • Latencia p99 media ≤ 400 ms
  • Tráfico descartado medio ≤ 5 %
  • Coste total ≤ 21 $
  • Recomendaciones disponibles ≥ 85 % del tiempo

Nivel 3 · Caché fría

En el pico del mediodía, un script de mantenimiento vacía toda la caché. Ahora cada petición va a la base de datos, dimensionada para la tasa de aciertos habitual del 85 %. Recupera el servicio sin sobrecargar la base de datos.

  • Tasa de errores media ≤ 1,5 %
  • Utilización de la base de datos nunca por encima del 90 % tras el primer minuto
  • Edad media de las respuestas en caché ≤ 90 s de media
  • Coste total ≤ 9 $
  • Recomendaciones disponibles ≥ 80 % del tiempo
  • Tráfico descartado medio ≤ 5 %

Base: el modelo detrás de las cifras

Todas las relaciones que usa el simulador, con su fuente. Las constantes marcadas como supuestos son calibraciones ilustrativas.

Las peticiones siguen una curva diaria más perturbaciones; el recuento por minuto es aleatorio (Poisson, aproximación normal) con algo de ráfagas.
λ(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]Supuesto: el número de workers, los tiempos de servicio, la capacidad de la base de datos, el tamaño de la caché, la velocidad de recarga, los precios y la tasa de error de la versión defectuosa son valores ilustrativos de un servicio web de tamaño medio.
Erlang C: la probabilidad de que una petición tenga que esperar a un worker libre en un sistema M/M/N.
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
Cola del tiempo de espera: la probabilidad de esperar más de t cae de forma exponencial; las peticiones que aún esperan en el tiempo límite de 2 s fallan. Más allá de la capacidad, el exceso falla.
P(W > t) = C·e^(−(N/S − λ)·t); timeouts = P(W > 2 s); a ≥ N ⇒ failed share = 1 − N/a[3]
Latencia p99 a partir de los cuantiles del tiempo de servicio y del tiempo de espera.
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]Aproximación: sumar los cuantiles de servicio y de espera no da el p99 exacto de su suma (puede salir algo alto o bajo); la cola se trata como estacionaria dentro de cada minuto porque las peticiones duran milisegundos.
Ley de Little: workers ocupados = tasa de llegada × tiempo en servicio.
busy workers L = λ·S ⇒ utilization = λ·S / N[4]
Caché con TTL: con peticiones aleatorias, cada fallo inicia un periodo de TTL durante el cual las peticiones aciertan.
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
Los fallos de caché cargan la base de datos; su retraso de cola ralentiza cada petición que la toca, lo que también llena los workers de la aplicación.
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]Supuesto: el número de workers, los tiempos de servicio, la capacidad de la base de datos, el tamaño de la caché, la velocidad de recarga, los precios y la tasa de error de la versión defectuosa son valores ilustrativos de un servicio web de tamaño medio.
SLO y presupuesto de errores: la tasa de consumo indica cuántas veces más rápido de lo permitido se está gastando el presupuesto.
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]
Autoescalador de seguimiento de objetivo con retraso de arranque y tiempo de enfriamiento.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]Supuesto: el número de workers, los tiempos de servicio, la capacidad de la base de datos, el tamaño de la caché, la velocidad de recarga, los precios y la tasa de error de la versión defectuosa son valores ilustrativos de un servicio web de tamaño medio.
Otras constantes de operación que usa el modelo.
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 instancesSupuesto: el número de workers, los tiempos de servicio, la capacidad de la base de datos, el tamaño de la caché, la velocidad de recarga, los precios y la tasa de error de la versión defectuosa son valores ilustrativos de un servicio web de tamaño medio.

Aleatoriedad: un generador mulberry32 con semilla; distribuciones usadas: uniforme, exponencial (CDF inversa), normal (Box–Muller), Poisson (Knuth). La semilla se muestra y se puede compartir.

Fuentes

  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

Quién se dedica a esto

Modelo educativo: no sirve para decisiones operativas. Las instalaciones reales calibran cada constante con sus propios equipos y datos.