Tutto parte da una domanda: che cosa fanno questi utenti? Mille persone collegate a un'applicazione non fanno mille richieste al secondo, e una pagina servita da una cache costa cento volte meno di una pagina calcolata. Questa guida traduce gli utenti in richieste, le richieste in processore e memoria, poi mostra come verificarlo con un test di carico.
«Utenti simultanei» indica tre grandezze diverse a seconda di chi parla:
Si passa dall'una all'altra con la legge di Little: il numero di richieste in corso è uguale al numero di richieste al secondo moltiplicato per la durata media di una richiesta.
Esempio. 600 utenti attivi nello stesso momento, che attivano ciascuno una richiesta ogni 20 secondi, fanno 30 richieste al secondo. Se ogni richiesta dura 100 ms, il server ha in media solo 3 richieste in corso. La vera sfida è altrove: nei picchi e nelle richieste lente.
Una richiesta occupa il processore per il tempo del suo calcolo: eseguire il codice, interrogare il database, costruire la risposta. Un vCPU elabora quindi al massimo 1.000 ÷ t richieste al secondo, dove t è il tempo di calcolo di una richiesta in millisecondi. Il tempo passato ad attendere (un'API esterna, un disco) non occupa il processore, ma occupa un worker.
| Tipo di richiesta | Tempo di calcolo tipico | Per vCPU, ordine di grandezza |
|---|---|---|
| File statico, o pagina servita da una cache | Meno di 1 ms | Diverse migliaia di richieste al secondo |
| Pagina WordPress servita da una cache delle pagine | Da 1 a 5 ms | Diverse centinaia al secondo |
| API JSON (Node.js, Go, FastAPI) con una query SQL indicizzata | Da 5 a 20 ms | Da 50 a 200 al secondo |
| Pagina WordPress o Laravel calcolata a ogni visita | Da 100 a 300 ms | Da 3 a 10 al secondo |
| Report, esportazione, generazione di PDF | Da 500 ms a diversi secondi | Meno di 2 al secondo |
Con questi ordini di grandezza, 30 richieste API al secondo a 10 ms di calcolo occupano il 30% di un solo vCPU. Le stesse 30 richieste al secondo su pagine WordPress senza cache richiedono da 3 a 9 vCPU. La cache delle pagine serve proprio a far passare una pagina dalla quarta riga della tabella alla seconda.
Ogni richiesta in corso è presa in carico da un worker, e i worker occupano memoria, che lavorino o no. Spesso è la memoria, più del processore, a decidere il numero di richieste elaborate in parallelo:
pm.max_children fissa il tetto: 20 processi significano da 800 MB a 1,6 GB.max_connections.Le connessioni persistenti (websocket, notifiche in tempo reale) si contano a parte: aperte in permanenza, occupano poco processore e qualche decina di kilobyte di memoria ciascuna. Un server Node.js ne regge migliaia in qualche centinaio di MB.
Su un'applicazione reale, il server raramente si satura dove ce lo si aspetta. Le cause più frequenti, nell'ordine in cui cercarle:
pg_stat_statements su PostgreSQL, o lo slow query log di MySQL, la individua.Gli ordini di grandezza danno una prima taglia; un test di carico dà quella vera. Il principio: simulare utenti sempre più numerosi su una copia dell'applicazione, e rilevare il momento in cui il tempo di risposta peggiora di colpo.
wrk -t2 -c50 -d30s --latency https://preprod.vostro-sito.com/
Per un percorso completo (accesso, navigazione, ricerca), k6 descrive uno scenario in JavaScript e fa salire il carico per gradi:
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 100 },
{ duration: '2m', target: 300 },
{ duration: '5m', target: 300 },
{ duration: '2m', target: 0 },
],
thresholds: { http_req_duration: ['p(95)<500'] },
};
export default function () {
http.get('https://preprod.vostro-sito.com/');
sleep(15);
}
htop per il processore, free -h per la memoria, i log per gli errori.L'ordine che costa meno e rende di più:
Le prime tre fasi coprono la grande maggioranza delle applicazioni gestionali, dei siti e delle API: diverse centinaia di utenti attivi nello stesso momento stanno su un solo server ben regolato.
Il VPS Pro è disponibile in sei taglie, su processori Intel Xeon, memoria ECC e SSD NVMe in mirroring, e passa alla taglia superiore in qualsiasi momento, senza reinstallazione. L'Assistenza integrale è compresa: diteci quanti utenti vi aspettate al lancio e fra un anno, e vi consigliamo la taglia; e quando una pagina rallenta, facciamo la diagnosi e vi indichiamo che cosa fare, dal sistema fino al codice della vostra applicazione.
Per un'API o un'applicazione le cui richieste richiedono da 10 a 20 ms di calcolo, diverse centinaia di utenti attivi nello stesso momento. Per un sito WordPress senza cache delle pagine, un centinaio circa. La differenza dipende dal tempo di calcolo di ogni richiesta e dalla cache, da qui l'utilità di un test di carico.
Il numero di visitatori al giorno dice poco: ciò che conta è il picco. Per passare dall'uno all'altro, dividete le visite della giornata per le ore di attività, moltiplicate per le pagine viste per visita, poi per un fattore di picco da 3 a 5. 10.000 visite su 10 ore, a 4 pagine ciascuna, danno circa 1 pagina al secondo in media, e da 3 a 5 al picco.
Tre segnali: il tempo di risposta sale con il traffico, il processore resta sopra l'80% nelle ore di punta, oppure la memoria disponibile scende vicino allo zero. I log del server web mostrano allora errori 502 o 504, e le richieste attendono un worker libero.
Sì: una connessione websocket resta aperta in permanenza. Consuma poco processore e qualche decina di kilobyte di memoria. Un server Node.js ne regge migliaia; sono i messaggi inviati, più delle connessioni aperte, a caricare il processore.
Simafri
Parliamo del vostro progetto
Diteci in due parole ciò che vi serve: vi rispondiamo rapidamente.
Grazie! La tua richiesta è stata inviata. Ti risponderemo a breve.
Preferite l'email? Scriveteci a support@simafri.com.