01 · Punto de partida
Pedidos que llegan, workers que atienden
Cada slot llega un pedido con a y se sirve uno con s (si hay). Con buffer K = 4, la cola Xₙ es Markov: si a > s crece y pierde; si a < s se vacía y sobra capacidad.
Los indicadores son latencia (cola media), throughput (servidos/slot) y pérdida (P(llena) con arribo).
- ¿Qué carga a y qué capacidad s por slot?
- ¿Qué cola media (latencia) resulta?
- ¿Cuánto throughput real sale?
- ¿Qué fracción se pierde por buffer lleno?
02 · Definición
Carga, capacidad y sus tres números
Todo sistema de cola-slots se resume en:
Carga ρ = a/s
ρ < 1 estable; ρ > 1 saturada. El semáforo del sistema.
Cola media
E[X]: proxy de latencia. Crece explosiva cerca de ρ = 1.
Pérdida
Arribo con cola llena: se pierde (o reintenta). P(X = K)·a.
Con K = 4, a = 0,4 y s = 0,5: ρ = 0,8, cola media ≈ 1,6 y pérdida ≈ 5 % (laboratorio).
| Caso | ρ | Régimen |
|---|---|---|
| a = 0,3, s = 0,6 | 0,5 | Vacía seguido, latencia baja. |
| a = 0,4, s = 0,5 | 0,8 | Cola media, pérdidas chicas. |
| a = 0,7, s = 0,5 | 1,4 | Llena siempre, pierde ~30 %. |
03 · Anatomía
Throughput, latencia y buffer
Cuatro lecturas del mismo π:
- Throughput
- Servidos por slot: mín(a, s·(1−π₀)). Con ρ < 1 es a (todo lo que llega sale).
- Latencia
- Cola media E[X]: a más cola, más espera (Little en espíritu).
- Pérdida
- Con buffer lleno y arribo: π_K·a. Más K, menos pérdida pero más latencia.
- Buffer K
- Amortigua ráfagas pero no crea capacidad: con ρ > 1 solo retrasa la pérdida.
ρ < 1
Estable
Throughput = a, cola acotada. Dimensionar por latencia.
ρ > 1
Saturada
Throughput = s, cola llena. Solo agregan capacidad o pierden.
04 · Ejemplos
Sistemas que son colas con otro nombre
Todo «llegan y se atienden» cabe en (a, s, K):
- 1API con workers.
a = 0,8/slot, s = 1: ρ = 0,8 con latencia media.
- 2Cola de impresión.
K grande: casi no pierde, pero espera.
- 3Reintentos.
Lo perdido vuelve: carga efectiva mayor que a.
- 4Cache.
Hit = servicio instantáneo: s alta con K chico.
- 5Videojuego.
Tick 60 Hz: a y s por frame, K = backlog tolerado.
05 · Representación en Python
Cola (a, s, K) en diez líneas
En Python, el paso es arribo menos servicio con topes: A ~ Bernoulli(a), S ~ Bernoulli(s) si hay. Con eso se simula y se mide.
Python en tu navegador. Estos bloques se ejecutan localmente con Pyodide, sin instalar nada. Subí a sobre s y mirá la saturación.
import random
def paso(x, a=0.4, s=0.5, K=4):
A = 1 if random.random() < a else 0
S = 1 if (x + A > 0 and random.random() < s) else 0
return min(K, max(0, x + A - S))
random.seed(7)
x = 0
for _ in range(10):
x = paso(x)
print(x, end=" ")
Con a < s la cola vuelve a 0 seguido; con a > s se pega al 4.
Throughput y pérdida simulados
Contando servidos y perdidos en N slots:
import random
def simular(a=0.4, s=0.5, K=4, N=5000, semilla=3):
random.seed(semilla)
x, serv, perd = 0, 0, 0
for _ in range(N):
A = 1 if random.random() < a else 0
if x == K and A:
perd += 1
A = 0 # no entra
S = 1 if (x + A > 0 and random.random() < s) else 0
x = min(K, max(0, x + A - S))
serv += S
return serv / N, perd / N
print([round(v, 3) for v in simular()])
06 · Exploración
Laboratorio: carga vs capacidad
Cola 0…4 con llegadas a y servicio s (6 réplicas de 40 slots). La línea gris es ρ = 1 (a = s). Pasala: la cola se pega arriba y la pérdida se dispara. Métricas: cola media, pérdida y ρ.
Del estable al saturado
ρ = a/s · X ∈ {0…4}
Con a 0,40 y s 0,50 (ρ 0,80): cola ≈ 1,6 y pérdida ≈ 5 %.
Cada línea es una cola; la blanca, el promedio. En saturación todas viven en 4: el buffer deja de amortiguar.
Preguntas para explorar
- Con a = 0,4 y s = 0,8 (ρ = 0,5), ¿la cola toca el 4? ¿La pérdida?
- Con a = 0,7 y s = 0,5 (ρ = 1,4), ¿dónde viven las líneas? ¿Throughput ≈ s?
- ¿Subir K a 8 salvaría con ρ = 1,4? ¿Latencia o pérdida?
Ver respuestas sugeridas
- Casi nunca: cola baja y pérdida ≈ 0 %. Sobrecapacidad.
- En 4: throughput ≈ s = 0,5 y el resto se pierde. Saturación.
- Baja pérdida pero dispara latencia: cola de 8 esperando. Capacidad, no buffer.
07 · Comprensión
Confusiones frecuentes
«ρ < 1 = sin cola»
No: con ρ = 0,8 hay cola media 1,6 por ráfagas. Estable ≠ vacía.
«Throughput siempre es a»
Solo con ρ < 1 y sin pérdidas. Saturada, es s (capacidad).
«Más buffer = más capacidad»
No: amortigua, no sirve más rápido. Con ρ > 1 solo alarga la espera.
«Pérdida 0 = sistema sano»
Puede esconder latencia brutal (K gigante). Mirar las tres métricas.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: leer ρ
Con a = 0,6 y s = 0,5, calculá ρ y anticipá el régimen.
a, s = 0.6, 0.5
print("rho:", a / s, "| régimen:", "saturada" if a > s else "estable")
Ver solución razonada
ρ = 1,2: saturada. La cola vivirá llena y el throughput será s.
Ejercicio 2: throughput en saturación
Sin ejecutar primero: con ρ > 1 y s = 0,5, ¿throughput cerca de qué? Comprobalo simulando.
import random
def thr(a=0.7, s=0.5, K=4, N=4000):
random.seed(2)
x, serv = 0, 0
for _ in range(N):
A = 1 if random.random() < a else 0
if x == K and A:
A = 0
S = 1 if (x + A > 0 and random.random() < s) else 0
x = min(K, max(0, x + A - S))
serv += S
return round(serv / N, 3)
print(thr())
Ver solución
≈ 0,5 = s: la capacidad manda, el resto se pierde.
Ejercicio 3: dimensionar workers
Si a = 0,8 y cada worker aporta s = 0,3, ¿cuántos workers para ρ ≤ 0,8?
Ver una posible respuesta
import math
print(math.ceil(0.8 / (0.8 * 0.3)))
4 workers (s total 1,2; ρ = 0,67). Con 3, ρ = 0,89: al límite.
09 · Síntesis
Ideas para recordar
- Xₙ₊₁ = mín(K, máx(0, Xₙ+A−S)) con ρ = a/s.
- ρ < 1 estable (throughput a); ρ > 1 saturada (throughput s).
- Medir cola media + throughput + pérdida siempre.
- K amortigua, s resuelve.
- En Python: Bernoulli por slot con topes.
Cerramos aplicaciones. En el final integrarás todo: proyecto de simulación.