Simulación de Eventos Discretos · Tema 22

Clientes y servidores

Quién espera y quién atiende — la pareja inseparable de toda cola, del banco al data center.

01 · Punto de partida

Demanda que llega, capacidad que atiende

Todo sistema de colas tiene dos elencos: los clientes, que traen trabajo (personas, requests, piezas), y los servidores, que lo hacen (cajas, workers, máquinas). Los clientes fluyen; los servidores permanecen y se ocupan.

La obra entera es el encuentro entre ambos: si hay servidor libre, hay servicio inmediato; si no, hay espera. Dimensionar es poner los servidores justos para los clientes que vienen.

  • ¿Quién es cliente y quién servidor en mi sistema?
  • ¿Cuántos servidores hay y son iguales?
  • ¿De dónde vienen los clientes: población infinita o grupo cerrado?
  • ¿Qué pasa si un servidor se libera y nadie espera?

02 · Definición

Tres caras de cada rol

●

Cliente

Trae trabajo S y atributos (prioridad, tipo). Nace en la llegada, muere en la salida. Impaciente a veces: abandona.

▣

Servidor

Presta S con tasa μ=1/S. Libre ⇄ ocupado. Con c idénticos el estado es el contador; si difieren, cada uno importa.

◍

Población

De dónde vienen: infinita (banco, web: llegan sin fin) o finita/cerrada (10 máquinas que se rompen y vuelven).

Reparto de roles por sistema.
SistemaClientesServidores (c)Población
BancoPersonasCajas (2)Infinita
WebRequestsWorkers (8)Infinita
Taller cerrado10 máquinas/piezasTécnicos (1)Finita: 10 que circulan
PeajeVehículosCabinas (4)Infinita

03 · Roles y encuentros

Cuatro encuentros posibles

llega cliente→¿servidor libre?→servicio u espera
  1. 1
    Libre + llega.

    Servicio inmediato, Wq=0. El servidor pasa a ocupado y agenda su fin.

  2. 2
    Ocupado + llega.

    A la cola con su hora. Su Wq nacerá cuando se libere uno.

  3. 3
    Fin + hay cola.

    El servidor encadena al siguiente sin descansar: el encuentro es instantáneo.

  4. 4
    Fin + sin cola.

    El servidor queda libre (ocio). El próximo cliente no esperará.

Población infinita
Los que llegan no vuelven (o son tantos que da igual): λ constante. Supuesto base de M/M/1 y M/M/c.
Población finita / cerrada
N fijo que circula (10 máquinas que fallan y se reparan): al haber menos afuera, λ efectiva cae. (Notación N, Tema 30)
Servidores idénticos vs. heterogéneos
Idénticos: cuenta el nº ocupado. Distintos (caja rápida/lenta): importa cuál toca, y el tipo del cliente elige.
Throughput
Salidas por unidad en régimen: igual a λ si es estable (todo lo que entra sale). Con pérdidas o abandono, menor.

Un servidor

Simple y frágil

Sin retos de reparto; si falla o es lento, todo sufre. Ideal para aprender.

Varios servidores

Reparto y escala

Hay que elegir a cuál va cada uno (primero libre, aleatorio, por tipo). Más c baja espera con retornos decrecientes.

04 · Ejemplos

Quién atiende a quién

  1. 1
    Banco 2 cajas, 6 clientes juntos.

    2 entran ya, 4 esperan. Cada fin encadena al siguiente: el laboratorio mide cuánto se tarda en vaciar (makespan).

  2. 2
    Web 8 workers.

    Requests que caen al primero libre: el reparto es automático y justo con fila única.

  3. 3
    Taller 10 máquinas, 1 técnico.

    Población cerrada: cada reparación devuelve una máquina afuera, que volverá a fallar. λ depende de cuántas estén sanas.

05 · Representación en Python

Lista de clientes, lista de servidores

Clientes como dicts en una cola; servidores como lista de libre_en. Asignar es tomar el servidor con menor libre_en.

Python en tu navegador. El primero reparte 6 juntos entre c; el segundo atiende llegadas escalonadas. Cambiá c y mirá el makespan.

# 6 clientes juntos (t=0), S=3, c=2: ¿cuándo sale el último?
S, c, N = 3.0, 2, 6
libres = [0.0] * c
for i in range(N):
    k = min(range(c), key=lambda j: libres[j])  # primero libre
    inicio = max(0.0, libres[k])
    libres[k] = inicio + S
    print(f"C{i+1} -> srv {k} [{inicio}, {libres[k]}]")
print("makespan:", max(libres))  # 9.0
# Con llegadas en 0, 2, 4 y c=1, S=3: ¿quién espera?
libre, S = 0.0, 3.0
for i, t in enumerate([0.0, 2.0, 4.0]):
    inicio = max(t, libre)
    libre = inicio + S
    print(f"C{i+1} llegó {t} esperó {round(inicio - t, 1)}")

06 · Exploración

Laboratorio: repartir N entre c

N clientes caen juntos en t=0 (pico brutal) con atención S y c servidores idénticos en fila única. Cada fila del Gantt es un servidor; cada bloque un cliente. Subí c y mirá cómo el makespan se parte y la espera media se desploma — con retornos decrecientes.

EXPERIMENTO 22

Fila única, c servidores

makespan ≈ techo(N/c)·S · fila única aprovecha huecos

Los resultados numéricos aparecen debajo.
Makespan (vaciar)0
Espera media0
Utilización media0%
El último sale—

Sube c para partir el pico.

Filas = servidores, bloques = clientes con su ID. Todos llegan en 0: la espera es pura consecuencia de c y S.

Preguntas para explorar

  1. Con N=6, S=3 y c=1, ¿makespan y espera media? ¿Y con c=2? ¿Y con c=3?
  2. ¿El paso de 2→3 ahorra lo mismo que el de 1→2? ¿Qué son retornos decrecientes?
  3. Con c=3 y N=3, ¿espera alguien? ¿Qué utilización da?
Ver respuestas sugeridas
  1. c=1: 18 y 7.5; c=2: 9 y 3.0; c=3: 6 y 1.5. Duplicar parte el makespan; triplicar lo deja en 6 (techo(6/3)·3).
  2. No: 1→2 ahorra 9, 2→3 solo 3. Cada servidor extra rinde menos: dimensionar es parar donde el ahorro ya no paga el costo.
  3. Nadie espera (uno por servidor) y U=100% solo durante 3: sobra capacidad ante este pico, falta ante el siguiente.

07 · Comprensión

Confusiones frecuentes

«Más servidores siempre es proporcionalmente mejor»

Los retornos son decrecientes: el 2º parte el pico, el 5º apenas lo roza. El laboratorio lo mide: 1→2 ahorra 9, 2→3 solo 3.

«Una fila por servidor es lo mismo»

Con filas separadas un cliente queda clavado mientras otra caja se libera. Fila única aprovecha cada hueco y minimiza la espera media.

«El servidor libre descansa gratis»

Descansa en espera (ocio) que cuesta utilización y salario. Ocio y espera son las dos caras del desbalance.

«Población finita es un detalle»

Con 10 máquinas circulando, cada reparación devuelve oferta futura: λ cae cuando muchas están rotas. Ignorarlo sobrestima la carga.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: makespan de un pico

N=6 juntos, S=3, c=2: ¿cuándo sale el último?

import math
N, S, c = 6, 3.0, 2
print("makespan:", math.ceil(N / c) * S)  # 9.0
Ver solución razonada

3 tandas de 2 × 3 = 9. Con c=1 serían 6 tandas (18); con c=3, 2 tandas (6).

Ejercicio 2: espera del tercero

Con c=1 y S=3, los 3 llegan en 0: ¿cuánto espera C3?

S = 3.0
print("C3 espera:", 2 * S)  # 6.0: dos servicios antes
Ver solución

6.0 (atienden C1 [0,3) y C2 [3,6), C3 entra en 6). Con c=2 esperaría 0: el segundo servidor lo absorbe.

Ejercicio 3: utilización del pico

N=6, S=3, c=2, makespan 9: ¿U media?

Ver una posible respuesta
N, S, c, makespan = 6, 3.0, 2, 9.0
print("U =", (N * S) / (c * makespan))  # 1.0: pico 100%

100%: en el pico nadie descansó. Fuera del pico la U cae: dimensionar por pico deja ocio valle.

09 · Síntesis

Ideas para recordar

  • Cliente trae demanda S; servidor presta capacidad; población infinita o cerrada.
  • Encuentros: libre+llega (directo), ocupado+llega (cola), fin+cola (encadena), fin solo (ocio).
  • Fila única a c servidores minimiza espera; filas separadas la inflan.
  • En Python: libre_en por servidor y asignar al mínimo.
  • Más c rinde decreciente: dimensionar es parar donde el ahorro paga el costo.

En el próximo tema mediremos el ritmo de la demanda: el proceso de llegada.