Combien d'utilisateurs simultanés tient un VPS : faire le calcul

Tout commence par une question : que font ces utilisateurs ? Mille personnes connectées à une application ne font pas mille requêtes par seconde, et une page servie depuis un cache coûte cent fois moins qu'une page calculée. Ce guide traduit des utilisateurs en requêtes, des requêtes en processeur et en mémoire, puis montre comment le vérifier par un test de charge.

Publié le 26 octobre 2026 Par Lecture : 9 minutes

Tous les guides

L'essentiel

  1. Des utilisateurs connectés ne sont pas des requêtes simultanées : un utilisateur actif envoie une requête toutes les 10 à 30 secondes environ.
  2. Requêtes en cours = requêtes par seconde × durée d'une requête (loi de Little). C'est ce nombre que le serveur doit tenir.
  3. Un vCPU sert au plus 1 000 ÷ (millisecondes de calcul par requête) requêtes par seconde : 20 ms de calcul, 50 requêtes par seconde.
  4. La mémoire borne le nombre de workers : chaque processus PHP ou Python occupe 40 à 200 Mo.
  5. Le cache change tout : une page servie depuis un cache coûte moins d’une milliseconde, une page WordPress calculée 100 à 300.
  6. Mesurez par un test de charge (k6, wrk) sur une copie de l’application, en montant par paliers.

Des utilisateurs aux requêtes

« Utilisateurs simultanés » désigne trois grandeurs différentes selon qui parle :

On passe de l'une à l'autre par la loi de Little : le nombre de requêtes en cours est égal au débit, en requêtes par seconde, multiplié par la durée moyenne d'une requête.

Exemple. 600 utilisateurs actifs en même temps, qui déclenchent chacun une requête toutes les 20 secondes, font 30 requêtes par seconde. Si chaque requête dure 100 ms, le serveur n'a que 3 requêtes en cours en moyenne. L'enjeu est ailleurs : dans les pics et dans les requêtes lentes.

Ce que tient un vCPU

Une requête occupe le processeur le temps de son calcul : exécuter le code, interroger la base, construire la réponse. Un vCPU traite donc au plus 1 000 ÷ t requêtes par seconde, où t est le temps de calcul d'une requête en millisecondes. Le temps passé à attendre (une API externe, un disque) n'occupe pas le processeur, mais il occupe un worker.

Type de requêteTemps de calcul typiquePar vCPU, ordre de grandeur
Fichier statique, ou page servie depuis un cacheMoins de 1 msPlusieurs milliers de requêtes par seconde
Page WordPress servie par un cache de pages1 à 5 msPlusieurs centaines par seconde
API JSON (Node.js, Go, FastAPI) avec une requête SQL indexée5 à 20 ms50 à 200 par seconde
Page WordPress ou Laravel calculée à chaque visite100 à 300 ms3 à 10 par seconde
Rapport, export, génération de PDF500 ms à plusieurs secondesMoins de 2 par seconde

Avec ces ordres de grandeur, 30 requêtes d'API par seconde à 10 ms de calcul occupent 30 % d'un seul vCPU. Les mêmes 30 requêtes par seconde sur des pages WordPress sans cache demandent 3 à 9 vCPU. Le cache de pages sert précisément à faire passer une page de la quatrième ligne du tableau à la deuxième.

Ce que tient la mémoire

Chaque requête en cours est prise en charge par un worker, et les workers occupent de la mémoire, qu'ils travaillent ou non. C'est souvent la mémoire, plus que le processeur, qui fixe le nombre de requêtes traitées en parallèle :

Les connexions persistantes (websockets, notifications en temps réel) se comptent à part : ouvertes en permanence, elles occupent peu de processeur et quelques dizaines de kilo-octets de mémoire chacune. Un serveur Node.js en tient des milliers dans quelques centaines de Mo.

Les vrais goulots d’étranglement

Sur une application réelle, le serveur sature rarement là où on l'attend. Les causes les plus fréquentes, dans l'ordre où les chercher :

  1. Une requête SQL lente : un index manquant transforme une requête de 2 ms en une requête de 2 secondes, qui retient un worker et une connexion. pg_stat_statements sur PostgreSQL, ou le journal des requêtes lentes de MySQL, la désigne.
  2. Les requêtes en cascade (le problème N+1) : une page qui lance une requête par ligne affichée en lance des centaines.
  3. Un appel externe synchrone : une API de paiement ou d'IA qui répond en 3 secondes bloque un worker synchrone pendant 3 secondes.
  4. Des traitements lourds dans la requête : envoi d'e-mails, redimensionnement d'images, génération de PDF, à déplacer dans une file de tâches.
  5. L'absence de cache : les pages identiques pour tous les visiteurs se servent depuis un cache, les fichiers statiques depuis le serveur web.

Le vérifier : le test de charge

Les ordres de grandeur donnent une première taille ; un test de charge donne la vraie. Le principe : simuler des utilisateurs de plus en plus nombreux sur une copie de l'application, et relever le moment où le temps de réponse décroche.

Terminal : 50 connexions pendant 30 secondes, avec wrk
wrk -t2 -c50 -d30s --latency https://preprod.votre-site.com/

Pour un parcours complet (connexion, navigation, recherche), k6 décrit un scénario en JavaScript et fait monter la charge par paliers :

Script k6 (test.js), lancé par : 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.votre-site.com/');
  sleep(15);
}

Quand la charge grandit

L'ordre qui coûte le moins et rapporte le plus :

  1. Mettre en cache ce qui peut l’être (pages, fragments, résultats de requêtes) et corriger les requêtes lentes.
  2. Régler le nombre de workers sur la mémoire et le processeur disponibles.
  3. Passer à une taille supérieure : plus de vCPU et de mémoire, sans rien changer à l'application.
  4. Placer la base de données sur son propre serveur.
  5. Répartir l'application sur plusieurs serveurs derrière un répartiteur de charge.

Les trois premières étapes couvrent la grande majorité des applications de gestion, des sites et des API : plusieurs centaines d'utilisateurs actifs en même temps tiennent sur un seul serveur bien réglé.

Un serveur qui grandit avec vos utilisateurs

Le VPS Pro se décline en six tailles, sur processeurs Intel Xeon, mémoire ECC et SSD NVMe en miroir, et passe à la taille supérieure à tout moment, sans réinstallation. L'Assistance intégrale est comprise : dites-nous combien d'utilisateurs vous attendez au lancement et dans un an, nous vous conseillons la taille ; et quand une page ralentit, nous diagnostiquons et vous indiquons quoi faire, du système jusqu'au code de votre application.

Découvrir le VPS Pro

Questions fréquentes

Combien d'utilisateurs peut supporter un VPS de 2 vCPU et 4 Go ?

Pour une API ou une application dont les requêtes prennent 10 à 20 ms de calcul, plusieurs centaines d'utilisateurs actifs en même temps. Pour un site WordPress sans cache de pages, une centaine environ. L'écart tient au temps de calcul de chaque requête et au cache, d'où l'intérêt d'un test de charge.

Combien de visiteurs par jour peut recevoir un VPS ?

Le nombre de visiteurs par jour dit peu de chose : ce qui compte, c'est le pic. Pour passer de l'un à l'autre, divisez les visites de la journée par les heures d'activité, multipliez par les pages vues par visite, puis par un facteur de pointe de 3 à 5. 10 000 visites sur 10 heures, à 4 pages chacune, donnent environ 1 page par seconde en moyenne, et 3 à 5 au pic.

Comment savoir si mon serveur sature ?

Trois signes : le temps de réponse monte avec le trafic, le processeur reste au-dessus de 80 % aux heures de pointe, ou la mémoire disponible tombe près de zéro. Les journaux du serveur web montrent alors des erreurs 502 ou 504, et les requêtes attendent un worker libre.

Les websockets changent-ils le calcul ?

Oui : une connexion websocket reste ouverte en permanence. Elle consomme peu de processeur et quelques dizaines de kilo-octets de mémoire. Un serveur Node.js en tient des milliers ; ce sont les messages envoyés, plus que les connexions ouvertes, qui chargent le processeur.

Contactez-nous