Dati statistici per il calcolo della concorrenza

Le formule della sezione Efficienza dei task IO-bound operano su diverse grandezze chiave. Di seguito una raccolta di misurazioni reali che permettono di inserire numeri concreti nelle formule.


Elementi delle formule

Legge di Little:

$$ L = \lambda \cdot W $$

  • L — il livello di concorrenza richiesto (quanti task contemporaneamente)
  • λ — throughput (richieste al secondo)
  • W — tempo medio di elaborazione di una richiesta

Formula di Goetz:

$$ N = N_{cores} \times \left(1 + \frac{T_{io}}{T_{cpu}}\right) $$

  • T_io — tempo di attesa I/O per richiesta
  • T_cpu — tempo di calcolo CPU per richiesta

Per il calcolo pratico, e' necessario conoscere:

  1. Quante query SQL vengono eseguite per richiesta HTTP
  2. Quanto tempo impiega una query SQL (I/O)
  3. Quanto tempo richiede l'elaborazione CPU
  4. Qual e' il throughput del server
  5. Qual e' il tempo di risposta complessivo

1. Query SQL per richiesta HTTP

Il numero di chiamate al database dipende dal framework, dall'ORM e dalla complessita' della pagina.

Applicazione / FrameworkQuery per paginaFonte
WordPress (senza plugin)~17Drupal Groups: How many queries per page
Symfony (Doctrine, pagina media)<30 (soglia profiler)Symfony Docs: Profiler testing
Laravel (CRUD semplice)5–15Valori tipici da Laravel Debugbar
Laravel (con problema N+1)20–50+Laravel Daily: Debug Slow Queries
Drupal (senza cache)80–100Drupal Groups
Magento (catalogo)50–200+Tipico per e-commerce complesso

Mediana per una tipica applicazione ORM: 15–30 query per richiesta HTTP.

Symfony utilizza una soglia di 30 query come limite "normale" — superata la quale, l'icona del profiler diventa gialla.

2. Tempo per query SQL (T_io per query)

Tempo di esecuzione della query sul server DB

Dati dai benchmark sysbench OLTP di Percona (MySQL):

ConcorrenzaQuota di query <0,1 ms0,1–1 ms1–10 ms>10 ms
1 thread86%10%3%1%
32 thread68%30%2%<1%
128 thread52%35%12%1%

LinkBench (Percona, approssimazione del carico reale di Facebook):

Operazionep50p95p99
GET_NODE0,4 ms39 ms77 ms
UPDATE_NODE0,7 ms47 ms100 ms

Fonte: Percona: MySQL and Percona Server in LinkBench, Percona: Query Response Time Histogram

Latenza di rete (round-trip)

ScenarioRound-tripFonte
Unix-socket / localhost<0,1 msCYBERTEC PostgreSQL
LAN, singolo data center~0,5 msCYBERTEC PostgreSQL
Cloud, cross-AZ1–5 msCYBERTEC PostgreSQL
Cross-region10–50 msValori tipici

Totale: tempo completo per query SQL

Tempo completo = tempo di esecuzione lato server + round-trip di rete.

AmbienteSELECT semplice (p50)Query media (p50)
Localhost0,1–0,5 ms0,5–2 ms
LAN (singolo DC)0,5–1,5 ms1–4 ms
Cloud (cross-AZ)2–6 ms3–10 ms

Per un ambiente cloud, 4 ms per query media e' una stima ben fondata.

3. Tempo CPU per query SQL (T_cpu per query)

Il tempo CPU copre: parsing del risultato, hydration delle entita' ORM, mapping degli oggetti, serializzazione.

Benchmark diretti di questo specifico valore sono scarsi nelle fonti pubbliche, ma possono essere stimati dai dati del profiler:

  • Blackfire.io separa il wall time in tempo I/O e tempo CPU (Blackfire: Time)
  • Nelle tipiche applicazioni PHP, il database e' il collo di bottiglia principale, e il tempo CPU costituisce una piccola frazione del wall time (Datadog: Monitor PHP Performance)

Stima indiretta tramite throughput:

Symfony con Doctrine (DB + rendering Twig) elabora ~1000 req/s (Kinsta PHP Benchmarks). Questo significa tempo CPU per richiesta ≈ 1 ms. Con ~20 query SQL per pagina → ~0,05 ms CPU per query SQL.

Endpoint API Laravel (Sanctum + Eloquent + JSON) → ~440 req/s (Sevalla: Laravel Benchmarks). Tempo CPU per richiesta ≈ 2,3 ms. Con ~15 query → ~0,15 ms CPU per query SQL.

4. Throughput (λ) delle applicazioni PHP

Benchmark eseguiti su 30 vCPU / 120 GB RAM, nginx + PHP-FPM, 15 connessioni concorrenti (Kinsta, Sevalla):

ApplicazioneTipo di paginareq/s (PHP 8.4)
LaravelWelcome (senza DB)~700
LaravelAPI + Eloquent + Auth~440
SymfonyDoctrine + Twig~1.000
WordPressHomepage (senza plugin)~148
Drupal 10~1.400

Da notare che WordPress e' significativamente piu' lento perche' ogni richiesta e' piu' pesante (piu' query SQL, rendering piu' complesso).


5. Tempo di risposta complessivo (W) in produzione

Dati da LittleData (2023, 2.800 siti e-commerce):

PiattaformaTempo medio di risposta del server
Shopify380 ms
Media e-commerce450 ms
WooCommerce (WordPress)780 ms
Magento820 ms

Fonte: LittleData: Average Server Response Time

Benchmark industriali:

CategoriaTempo di risposta API
Eccellente100–300 ms
Accettabile300–600 ms
Necessita ottimizzazione>600 ms

Calcolo pratico con la Legge di Little

Scenario 1: API Laravel nel cloud

Dati di input:

  • λ = 440 req/s (throughput target)
  • W = 80 ms (calcolato: 20 SQL × 4 ms I/O + 1 ms CPU)
  • Core: 8

Calcolo:

$$ L = \lambda \cdot W = 440 \times 0.080 = 35 \text{ task concorrenti} $$

Su 8 core, sono ~4,4 task per core. Questo corrisponde al fatto che Laravel con 15 worker PHP-FPM concorrenti raggiunge gia' 440 req/s. C'e' margine di crescita.

Scenario 2: API Laravel nel cloud, 2000 req/s (target)

Dati di input:

  • λ = 2000 req/s (throughput target)
  • W = 80 ms
  • Core: 8

Calcolo:

$$ L = 2000 \times 0.080 = 160 \text{ task concorrenti} $$

PHP-FPM non puo' gestire 160 worker su 8 core — ogni worker e' un processo separato con ~30–50 MB di memoria. Totale: ~6–8 GB solo per i worker.

Con le coroutine: 160 task × ~4 KiB ≈ 640 KiB. Una differenza di quattro ordini di grandezza.

Scenario 3: Utilizzo della formula di Goetz

Dati di input:

  • T_io = 80 ms (20 query × 4 ms)
  • T_cpu = 1 ms
  • Core: 8

Calcolo:

$$ N = 8 \times \left(1 + \frac{80}{1}\right) = 8 \times 81 = 648 \text{ coroutine} $$

Throughput (tramite la Legge di Little):

$$ \lambda = \frac{L}{W} = \frac{648}{0.081} \approx 8,000 \text{ req/s} $$

Questo e' il tetto teorico con pieno utilizzo di 8 core. In pratica, sara' inferiore a causa dell'overhead dello scheduler, del GC, dei limiti del pool di connessioni. Ma anche il 50% di questo valore (4.000 req/s) e' un ordine di grandezza superiore ai 440 req/s di PHP-FPM sugli stessi 8 core.

Riepilogo: da dove provengono i numeri

GrandezzaValoreFonte
Query SQL per richiesta HTTP15–30WordPress ~17, soglia Symfony <30
Tempo per query SQL (cloud)3–6 msPercona p50 + CYBERTEC round-trip
CPU per query SQL0,05–0,15 msCalcolo inverso dai benchmark di throughput
Throughput Laravel~440 req/s (API)Benchmark Sevalla/Kinsta, PHP 8.4
Tempo di risposta e-commerce (media)450 msLittleData, 2.800 siti
Tempo di risposta API (norma)100–300 msBenchmark industriale

Riferimenti

Benchmark dei framework PHP

Benchmark dei database

Tempi di risposta dei sistemi in produzione

Profilazione PHP