🖥️ 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
Por qué la latencia se dispara cerca de la utilización total (Erlang C) y por qué el autoescalado con retraso de arranque siempre llega tarde.
Cómo los SLO, los presupuestos de errores y las alertas de tasa de consumo deciden cuándo revertir.
Cómo una caché fría se convierte en una caída de la base de datos y qué palancas ganan tiempo: descartar tráfico, degradar, calentar.
Simulador
Tiempo 0 min
▶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. Pulsar 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 ×
Peticiones
1125 req/s
Instancias atendiendo
10
Instancias arrancando
0
Tasa de aciertos de caché
77 %
Utilización de la base de datos
19 %
Tráfico descartado
0 %
Coste de la flota
4,00 $/h
Coste hasta ahora
0,00 $
Edad media de las respuestas en caché
30 s
Tráfico en la versión defectuosa
0 %
Recomendaciones disponibles
100 %
Tendencia
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 nuevas instancias tardan 8 minutos en arrancar. Cuando llegue, mantén bajos los errores y la latencia sin gastar 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.
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.
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.
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