Quanti utenti simultanei regge un VPS: fare il calcolo

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.

Pubblicato il 26 ottobre 2026 Di Lettura: 9 minuti

Tutte le guide

In breve

  1. Utenti collegati e richieste simultanee sono due cose diverse: un utente attivo invia una richiesta a intervalli compresi tra 10 e 30 secondi circa.
  2. Richieste in corso = richieste al secondo × durata di una richiesta (legge di Little). È questo il numero che il server deve reggere.
  3. Un vCPU serve al massimo 1.000 ÷ (millisecondi di calcolo per richiesta) richieste al secondo: con 20 ms di calcolo, 50 richieste al secondo.
  4. La memoria limita il numero di worker: ogni processo PHP o Python occupa da 40 a 200 MB.
  5. La cache cambia tutto: una pagina servita da una cache costa meno di un millisecondo, una pagina WordPress calcolata da 100 a 300.
  6. Misurate con un test di carico (k6, wrk) su una copia dell'applicazione, salendo per gradi.

Dagli utenti alle richieste

«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.

Quanto regge un vCPU

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 richiestaTempo di calcolo tipicoPer vCPU, ordine di grandezza
File statico, o pagina servita da una cacheMeno di 1 msDiverse migliaia di richieste al secondo
Pagina WordPress servita da una cache delle pagineDa 1 a 5 msDiverse centinaia al secondo
API JSON (Node.js, Go, FastAPI) con una query SQL indicizzataDa 5 a 20 msDa 50 a 200 al secondo
Pagina WordPress o Laravel calcolata a ogni visitaDa 100 a 300 msDa 3 a 10 al secondo
Report, esportazione, generazione di PDFDa 500 ms a diversi secondiMeno 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.

Quanto regge la memoria

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:

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.

I veri colli di bottiglia

Su un'applicazione reale, il server raramente si satura dove ce lo si aspetta. Le cause più frequenti, nell'ordine in cui cercarle:

  1. Una query SQL lenta: un indice mancante trasforma una query da 2 ms in una da 2 secondi, che trattiene un worker e una connessione. pg_stat_statements su PostgreSQL, o lo slow query log di MySQL, la individua.
  2. Le query a cascata (il problema N+1): una pagina che lancia una query per ogni riga visualizzata ne lancia centinaia.
  3. Una chiamata esterna sincrona: un'API di pagamento o di IA che risponde in 3 secondi blocca un worker sincrono per 3 secondi.
  4. Elaborazioni pesanti dentro la richiesta: invio di email, ridimensionamento di immagini, generazione di PDF, da spostare in una coda di job.
  5. L'assenza di cache: le pagine identiche per tutti i visitatori si servono da una cache, i file statici dal server web.

Verificarlo: il test di carico

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.

Terminale: 50 connessioni per 30 secondi, con wrk
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:

Script k6 (test.js), avviato con: k6 run test.js
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);
}

Quando il carico cresce

L'ordine che costa meno e rende di più:

  1. Mettere in cache ciò che si può (pagine, frammenti, risultati di query) e correggere le query lente.
  2. Regolare il numero di worker sulla memoria e sul processore disponibili.
  3. Passare a una taglia superiore: più vCPU e memoria, senza cambiare nulla nell'applicazione.
  4. Spostare il database su un server tutto suo.
  5. Distribuire l'applicazione su più server dietro un bilanciatore di carico.

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.

Un server che cresce con i vostri utenti

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.

Scoprire il VPS Pro

Domande frequenti

Quanti utenti può reggere un VPS da 2 vCPU e 4 GB?

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.

Quanti visitatori al giorno può ricevere un VPS?

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.

Come capire se il mio server è saturo?

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.

I websocket cambiano il calcolo?

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.

Contattaci