01 · Punto de partida
La pregunta que paga el curso
“¿Cuántas cajas abro a las 12?” “¿Cuántos agentes contrato?” “¿Cuántos workers levanto?” La respuesta no es ρ < 1 (eso es el piso) sino el c mínimo que cumple el SLA al menor costo: con λ = 0.9/min y S = 2, el SLA “80% espera ≤ 2 min” pide c = 3 (89%) y recomienda 4 (99%) con margen.
Dimensionar es recorrer la curva del Tema 44 con la billetera en la mano: cada servidor suma costo fijo y resta espera con retornos decrecientes.
- ¿Qué datos entran (λ pico, S, SLA, costo)?
- ¿Cómo hallo el c mínimo que cumple el SLA?
- ¿Cuánto margen agrego y por qué?
- ¿Cómo se informa la decisión?
02 · Definición
Demanda, oferta, nivel y precio
Demanda
λ pico (no media) + S medio + crecimiento. Se dimensiona por la ventana que duele.
Nivel
SLA “X% espera ≤ t” (ej. 80/2 min, 80/20 s). P(Wq ≤ t) = 1 − C·e−(cμ−λ)t.
Precio
Costo por servidor (salario, puesto, licencia) vs costo de esperar (fuga, SLA). El c óptimo equilibra.
| c | ρ | P(Wq ≤ 2) | Lectura |
|---|---|---|---|
| 2 | 0.90 | ≈ 30% | No cumple (tenso) |
| 3 | 0.60 | ≈ 90% | Mínimo que cumple |
| 4 | 0.45 | ≈ 99% | Recomendado (+1 margen) |
03 · El corazón: el algoritmo de cinco pasos
Del pico al puesto, sin adivinar
- 1Medir demanda pico.
λ de la ventana peor + S medio + crecimiento esperado. La media diaria esconde el mediodía.
- 2Piso de estabilidad.
c > a = λ/μ (cmín ≥ ⌊a⌋ + 1). Debajo no hay SLA que valga.
- 3Subir hasta el SLA.
Con Erlang C (o sim por punto sin fórmula): primer c con P(Wq ≤ t) ≥ objetivo.
- 4Sumar margen y validar.
+1 (N+1) por picos, ausencias y crecimiento; validar con sim en régimen + Little.
- 5Informar con precio.
(λ, S, SLA, c, ρ, Wq, costo): la fila que se compra y la que se descarta, con números.
- Erlang A (telefónico)
- El “80% en 20 s” de call centers: la misma cuenta con t = 20 s. La industria dimensiona así hace un siglo.
- N+1
- Un servidor extra sobre el mínimo: cubre el pico imprevisto y la ausencia sin romper SLA. Barato contra la fuga.
- Headroom
- Margen de crecimiento (ej. +20% λ): se dimensiona con λ futura, no con la de hoy.
- Costo de esperar
- Fuga, reclamos, SLA penalizado: justifica el +1 cuando el salario parece caro y la espera sale más.
Por utilización
Barato y ciego
“ρ < 0.8” fija c sin mirar SLA: puede sobrar (SLA laxo) o faltar (SLA duro). Sirve de piso, no de veredicto.
Por SLA
Caro y certero
P(Wq ≤ t) por c decide con la promesa en la mano. Cuesta un cálculo (Erlang o sim) y ahorra puestos o fugas.
04 · Ejemplos
Tres compras con número
- 1Banco SLA 80% ≤ 2 min.
a = 1.8: c = 3 cumple (90%), se recomienda 4 (99%). ρ 0.6 → 0.45.
- 2Call center 80/20 s, a = 6.
c = 7 tenso (ρ = 0.86), c = 8 cumple holgado: se compra 8 + colchón de ausencias.
- 3Web: workers = λW + margen.
100 r/s × 0.05 s = 5 + N+1 = 6–7 workers (Little dimensiona, el margen asegura).
05 · Representación en Python
dimensionar() que devuelve la compra
Barrer c con Erlang C, cortar por SLA y sumar margen: la tabla que firma el decisor.
Python en tu navegador. El primero tabula P(Wq ≤ t) por c; el segundo elige mínimo + recomendado. Cambiá el SLA.
# Tabla SLA por c: lam=0.9, mu=0.5, t=2, objetivo 80%
import math
def nivel(lam, mu, c, t):
a, rho = lam/mu, lam/mu/c
s = sum(a**k/math.factorial(k) for k in range(c))
C = (a**c/(math.factorial(c)*(1-rho)))/(s + a**c/(math.factorial(c)*(1-rho)))
return 1 - C*math.exp(-(c*mu-lam)*t)
for c in [2, 3, 4]:
print(f"c={c} P={nivel(0.9, 0.5, c, 2):.0%}")
# Elegir mínimo + recomendado (+1) con costo en puestos
def dimensionar(lam, mu, t, obj=0.8, costo_puesto=1):
for c in range(1, 12):
if lam/mu/c >= 1:
continue
if nivel(lam, mu, c, t) >= obj:
rec = c + 1
return {"c_min": c, "c_rec": rec, "costo": rec*costo_puesto,
"rho": round(lam/mu/rec, 2)}
print(dimensionar(0.9, 0.5, 2)) # c_min=3, rec=4
06 · Exploración
Laboratorio: el dimensionador con perillas
Elegí λ, S y el SLA (“P% espera ≤ 2 min”). Las barras muestran P(Wq ≤ 2) por c = 1…6 (roja donde no hay régimen); la recta es tu objetivo; la corona marca el mínimo que cumple y la banda el recomendado (+1). Subí λ y mirá cómo la compra crece.
Del SLA al puesto
P(Wq≤2) por c · t=2 fijo
Subí el SLA para encarecer la compra.
Barras = P(Wq ≤ 2) por c; recta = tu objetivo; corona = mínimo que cumple; banda = recomendado +1.
Preguntas para explorar
- Default (λ=0.9, S=2, 80%): ¿cmín? ¿P? ¿Recomendado y ρ?
- Subí el SLA a 99%: ¿nuevo mínimo? ¿Cuánto cuesta el punto extra?
- Bajá λ a 0.5: ¿mínimo? ¿El +1 sigue teniendo sentido?
Ver respuestas sugeridas
- c = 3 (P ≈ 90%), recomendado 4 (ρ = 0.45, P ≈ 99%): margen por 1 puesto.
- c = 4 (el 3 da 90%): el último 9% cuesta un puesto entero (retornos decrecientes con precio).
- c = 2 (a = 1.0): el +1 (c = 3, ρ = 0.33) parece lujo, pero cubre el pico que la media esconde.
07 · Comprensión
Confusiones frecuentes
«Dimensiono por media diaria»
La media esconde el pico que colapsa: se dimensiona por ventana pico + crecimiento, no por día.
«c = ⌈a⌉ alcanza»
Deja ρ ≈ 1 sin margen ni SLA: es el piso de estabilidad, no una compra. El mínimo real sale del SLA.
«SLA en media»
“Wq ≤ 5 en media” no promete nada a nadie: el SLA es percentil (P(Wq ≤ t) ≥ X%). Sin % no hay SLA.
«El +1 es despilfarro»
Cubre pico, ausencia y crecimiento por un puesto: lo caro es romper el SLA un mediodía entero.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: tabla y compra
λ=0.9, μ=0.5, t=2, objetivo 80%. ¿cmín? ¿P con cada c?
# c=2: 30%, c=3: 90%, c=4: 99% -> compra 3, recomienda 4
print("El salto 2->3 vale 60 puntos; el 3->4 vale 9")
Ver solución razonada
30/90/99: el mínimo cumple justo; el +1 compra el colchón del 99%.
Ejercicio 2: precio del 99%
Con objetivo 99% en vez de 80%: ¿nuevo mínimo? ¿Costo extra?
# 80% -> c=3; 99% -> c=4: un puesto por 9 puntos (retornos con precio)
print("Del 90 al 99 se paga puesto entero")
Ver solución
c = 4: el último tramo de SLA es el más caro por punto. Decidirlo es negocio, no colas.
Ejercicio 3: pico vs media
Media λ=0.5, pico λ=0.9 (S=2, SLA 80/2). ¿c por media vs por pico?
Ver una posible respuesta
# media a=1.0 -> c=2; pico a=1.8 -> c=3 (+1 = 4): el pico manda
print("Por media colapsa al mediodía; por pico sobra a la mañana (turnos)")
c = 2 colapsa en pico; c = 3 (+1 = 4) lo absorbe: turnos por ventana, no plantilla única.
09 · Síntesis
Ideas para recordar
- Entradas: λ pico, S, SLA “X% ≤ t”, costo. Salida: cmín + 1.
- cmín = primer c con P(Wq ≤ t) ≥ objetivo (Erlang o sim).
- +1 de margen: pico, ausencias, crecimiento.
- En Python: tabla por c + corte + costo en puestos.
- Por media se colapsa, por SLA se compra, con margen se duerme.
En el próximo tema compararemos con rigor estadístico: comparación de configuraciones.