Torna al blog
MatematicaPerformanceSistemi

Teoria delle code e dimensionamento dei sistemi

MUSTNODE SRL10 min di lettura

Perche i sistemi si congestionano

Un'API che rallenta sotto carico, una linea di produzione che accumula pezzi in attesa, un servizio che va in timeout: sono tutti problemi di code. La teoria delle code fornisce gli strumenti matematici per capire e dimensionare questi sistemi.

La legge di Little

Il risultato piu importante e anche il piu semplice. La legge di Little lega tre grandezze:

L=λWL = \lambda \, W

dove:

  • LL e il numero medio di elementi nel sistema;
  • λ\lambda e il tasso medio di arrivo;
  • WW e il tempo medio di permanenza nel sistema.

E sorprendentemente generale: vale per qualsiasi sistema stabile, indipendentemente dalla distribuzione degli arrivi. Se un'API riceve 100 richieste al secondo e ciascuna resta nel sistema 0.2 secondi, in media ci sono L=1000.2=20L = 100 \cdot 0.2 = 20 richieste in elaborazione.

Il modello M/M/1

Il modello base e l'M/M/1: arrivi poissoniani con tasso λ\lambda, tempi di servizio esponenziali con tasso μ\mu, un solo servente. Il parametro chiave e l'utilizzo:

ρ=λμ\rho = \frac{\lambda}{\mu}

Perche il sistema sia stabile serve ρ<1\rho < 1. Il tempo medio di permanenza e:

W=1μλW = \frac{1}{\mu - \lambda}

L'insidia della saturazione

Ecco il punto cruciale: il tempo di attesa non cresce in modo lineare con il carico, ma esplode quando ρ\rho si avvicina a 1. Il numero medio in coda e:

Lq=ρ21ρL_q = \frac{\rho^2}{1 - \rho}

Con ρ=0.8\rho = 0.8 abbiamo Lq=3.2L_q = 3.2; con ρ=0.95\rho = 0.95 salta a 1818; con ρ=0.99\rho = 0.99 arriva a 9898. Questo spiega perche i sistemi sembrano andare bene fino a un certo punto, poi collassano improvvisamente.

def coda_mm1(lmbda, mu):
    rho = lmbda / mu
    if rho >= 1:
        return {"stabile": False}
    return {
        "stabile": True,
        "utilizzo": rho,
        "in_coda": rho**2 / (1 - rho),
        "tempo_sistema": 1 / (mu - lmbda),
    }

print(coda_mm1(80, 100))   # rho 0.8
print(coda_mm1(95, 100))   # rho 0.95 -> attesa molto maggiore

Implicazioni pratiche

  • Non puntare al 100 percento di utilizzo: lasciare margine (es. ρ0.7\rho \le 0.7) e ingegneria, non spreco.
  • Aggiungere serventi (scalare orizzontalmente) sposta il punto di saturazione.
  • Ridurre la variabilita dei tempi di servizio migliora le code piu di quanto si pensi.

Conclusione

La teoria delle code trasforma intuizioni vaghe in numeri concreti per dimensionare API, microservizi e processi produttivi. In MUSTNODE la usiamo per progettare sistemi che reggono il carico reale, evitando i colli di bottiglia prima che si presentino in produzione.

Articoli correlati

Altri approfondimenti dalla categoria Dati & AI.