Simulación de Eventos Discretos · Tema 46

Dimensionamiento de recursos

Cuántos servidores para un nivel de servicio — del pico y el SLA al c mínimo, con margen y con precio.

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.

λ = 0.9/min, S = 2 (a = 1.8), SLA 80% ≤ 2 min.
cρP(Wq ≤ 2)Lectura
20.90≈ 30%No cumple (tenso)
30.60≈ 90%Mínimo que cumple
40.45≈ 99%Recomendado (+1 margen)

03 · El corazón: el algoritmo de cinco pasos

Del pico al puesto, sin adivinar

pico + S→c piso→subir hasta SLA→+1 y validar
  1. 1
    Medir demanda pico.

    λ de la ventana peor + S medio + crecimiento esperado. La media diaria esconde el mediodía.

  2. 2
    Piso de estabilidad.

    c > a = λ/μ (cmín ≥ ⌊a⌋ + 1). Debajo no hay SLA que valga.

  3. 3
    Subir hasta el SLA.

    Con Erlang C (o sim por punto sin fórmula): primer c con P(Wq ≤ t) ≥ objetivo.

  4. 4
    Sumar margen y validar.

    +1 (N+1) por picos, ausencias y crecimiento; validar con sim en régimen + Little.

  5. 5
    Informar 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

  1. 1
    Banco SLA 80% ≤ 2 min.

    a = 1.8: c = 3 cumple (90%), se recomienda 4 (99%). ρ 0.6 → 0.45.

  2. 2
    Call center 80/20 s, a = 6.

    c = 7 tenso (ρ = 0.86), c = 8 cumple holgado: se compra 8 + colchón de ausencias.

  3. 3
    Web: 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.

EXPERIMENTO 46

Del SLA al puesto

P(Wq≤2) por c · t=2 fijo

Los resultados numéricos aparecen debajo.
c mínimo0
P con c mín0%
c recomendado0
Costo (puestos)0

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

  1. Default (λ=0.9, S=2, 80%): ¿cmín? ¿P? ¿Recomendado y ρ?
  2. Subí el SLA a 99%: ¿nuevo mínimo? ¿Cuánto cuesta el punto extra?
  3. Bajá λ a 0.5: ¿mínimo? ¿El +1 sigue teniendo sentido?
Ver respuestas sugeridas
  1. c = 3 (P ≈ 90%), recomendado 4 (ρ = 0.45, P ≈ 99%): margen por 1 puesto.
  2. c = 4 (el 3 da 90%): el último 9% cuesta un puesto entero (retornos decrecientes con precio).
  3. 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.