La mémoire est la ressource qui fixe le plus souvent la taille d'un serveur : c'est elle qui manque en premier, et quand elle manque, le serveur ne ralentit pas, il arrête des services. Ce guide donne la règle de calcul, ce que consomme chaque brique d'une application, des profils types et la façon de mesurer sur un serveur qui tourne déjà.
available de free -h, pas la colonne free.Un serveur ne consomme pas de la mémoire « en général » : chaque programme qui tourne en garde une part, tant qu'il tourne. Le calcul part donc de la liste des processus présents en permanence, puis ajoute le pic et une marge :
Mémoire à prévoir = (système + services permanents + pic des tâches ponctuelles) × 1,25
Les ordres de grandeur ci-dessous valent pour une application de taille courante, mesurée en production. Ils donnent un point de départ ; la mesure sur votre propre application, décrite plus bas, a toujours le dernier mot.
| Brique | Mémoire typique | Ce qui la fait varier |
|---|---|---|
| Nginx, Caddy (serveur web, proxy) | 10 à 50 Mo | Presque fixe : le nombre de connexions pèse peu. |
| PHP-FPM (WordPress, Laravel, Symfony) | 40 à 80 Mo par processus | Le nombre de processus, plafonné par pm.max_children : 10 processus, 400 à 800 Mo. |
| Node.js (API, Next.js, NestJS) | 60 à 300 Mo par processus | Le nombre de processus (mode cluster, PM2) et la taille du tas, bornée par --max-old-space-size. |
| Python (Django, FastAPI, Flask) | 80 à 200 Mo par processus | Le nombre de workers Gunicorn ou Uvicorn, et les bibliothèques chargées : pandas ou un modèle d'apprentissage automatique ajoutent des centaines de Mo. |
| Java (Spring Boot) | 300 Mo à 1 Go par application | La taille maximale du tas : par défaut, la JVM s'accorde le quart de la mémoire qu'elle voit. |
| Go, Rust | 10 à 100 Mo | Les données que l'application garde elle-même en mémoire. |
| PostgreSQL | 25 % de la mémoire pour shared_buffers, plus quelques Mo par connexion | Le volume de données consultées souvent, le nombre de connexions, work_mem. |
| MySQL, MariaDB | innodb_buffer_pool_size, 128 Mo par défaut | Sur un serveur dédié à la base, ce tampon prend couramment jusqu'à 80 % de la mémoire. |
| Redis | La taille des données, plus ses structures | Pendant une sauvegarde sur disque, les pages modifiées sont dupliquées : jusqu'au double dans le pire cas. |
| Elasticsearch, OpenSearch | 2 Go au moins pour le tas | Le tas ne dépasse pas la moitié de la mémoire : le reste sert au cache des fichiers. |
Un pic revient souvent avec les applications JavaScript : la compilation. npm run build sur un projet Next.js, Nuxt ou Angular demande couramment 1 à 2 Go à lui seul, pendant quelques minutes, en plus de ce qui tourne déjà. Compiler sur le serveur, c'est dimensionner pour ce pic ; compiler sur votre poste ou dans votre intégration continue et ne déposer que le résultat, c'est l'éviter.
Même raisonnement pour les conteneurs Docker : chaque conteneur est un ensemble de processus comme les autres, et le démon Docker ajoute sa propre consommation. docker stats affiche ce que prend chacun.
Ces profils additionnent les briques précédentes, pic et marge compris. Ils supposent une application de taille courante et le trafic d'un lancement ; une base volumineuse ou un trafic soutenu déplacent le curseur vers le haut.
| Ce qui tourne sur le serveur | Mémoire à prévoir |
|---|---|
| Site statique, proxy, petit robot ou script planifié | 1 à 2 Go |
| Un site WordPress avec MariaDB et un cache de pages | 2 Go |
| Une boutique WooCommerce, ou plusieurs sites WordPress | 4 Go |
| Une API Node.js ou Python avec PostgreSQL, premiers utilisateurs | 4 Go |
| Une application Next.js compilée sur le serveur, son API et sa base PostgreSQL | 6 à 8 Go |
| Plusieurs applications en conteneurs, préproduction et production | 8 Go |
| Une base de données de plusieurs dizaines de Go, consultée intensivement | 16 Go et plus |
| Un modèle de langage de 7 à 8 milliards de paramètres exécuté sur le serveur | 16 Go |
Une application qui appelle un modèle d'IA par API (OpenAI, Anthropic, Mistral) se dimensionne comme n'importe quelle application web : le modèle tourne chez son éditeur, et votre serveur attend sa réponse. C'est l'exécution du modèle sur le serveur lui-même qui fait changer d'échelle.
Sur un serveur en service, la mesure remplace l'estimation. Trois commandes disent où l'on en est :
free -h
ps aux --sort=-rss | head -n 15
vmstat 5 5
free -h : lisez la colonne available, la mémoire réellement disponible pour lancer de nouveaux programmes. La colonne free est presque toujours basse, et c'est normal : Linux remplit la mémoire inutilisée avec le cache des fichiers (buff/cache), qu'il rend dès qu'un programme en a besoin.ps aux --sort=-rss : les processus classés par mémoire occupée (colonne RSS, en kilo-octets). C'est ici que l'on voit ce que pèse chaque worker PHP ou Node.js.vmstat 5 5 : cinq relevés à cinq secondes d'intervalle. Des valeurs non nulles dans les colonnes si et so, relevé après relevé, signalent un serveur qui échange avec le swap : il manque de mémoire.Mesurez au moment le plus chargé de la journée, et pendant les tâches ponctuelles : compilation, sauvegarde, import. C'est le pic qui compte.
Un serveur à court de mémoire ne ralentit pas progressivement. Quand il n'y a plus rien à libérer, le noyau Linux déclenche l'OOM killer (out of memory) : il choisit un processus, en général celui qui occupe le plus de mémoire, et l'arrête net. Sur un serveur applicatif, c'est souvent la base de données.
Les symptômes : des erreurs 502 ou 503 par moments, un service qui redémarre sans raison apparente, une compilation qui s'interrompt sur Killed. Les journaux le confirment :
journalctl -k | grep -i "out of memory"
systemctl status nom-du-service
Dans la sortie de systemctl status, la mention Failed with result 'oom-kill' désigne un service arrêté faute de mémoire.
Le swap, quand le serveur en dispose, retarde ce moment en déplaçant sur disque la mémoire la moins utilisée. Il sert de filet, pas de capacité : un serveur qui s'appuie sur le swap en continu répond plusieurs fois plus lentement, même sur un SSD NVMe.
Les remèdes, du plus simple au plus durable : réduire le nombre de processus de l'application (pm.max_children, workers Gunicorn), compiler hors du serveur, borner la mémoire de la base de données, puis passer à une taille supérieure.
La mémoire n'est pas la seule ressource : le processeur compte pour ce qui calcule (compilation, traitement d'images, exécution d'un modèle d'IA), le disque pour la base de données et les fichiers. Pour une application web, c'est pourtant presque toujours la mémoire qui fixe la taille.
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 : décrivez-nous ce que votre serveur fera tourner, nous vous conseillons la taille, puis nous diagnostiquons et vous indiquons quoi faire à chaque question, du système jusqu'au code de votre application.
Un site statique, un proxy ou un petit script tournent dans 1 à 2 Go. Dès qu'une base de données et une application (PHP, Node.js, Python) partagent le serveur, comptez 2 Go pour un site WordPress et 4 Go pour une application sur mesure avec PostgreSQL.
2 Go pour un site avec MariaDB et un cache de pages, 4 Go pour une boutique WooCommerce ou plusieurs sites. Le nombre de processus PHP-FPM est le premier réglage : chacun occupe 40 à 80 Mo.
Non. Le swap évite un arrêt brutal quand la mémoire est pleine, mais un serveur qui s'en sert en continu répond plusieurs fois plus lentement, même sur un SSD NVMe. C'est un filet de sécurité ; la taille se choisit sur la mémoire.
Parce que Linux utilise la mémoire inutilisée comme cache des fichiers. Ce cache se libère dès qu'un programme a besoin de mémoire. La colonne à lire est available, qui donne la mémoire réellement disponible.
Comptez 1 à 2 Go pour la compilation seule, en plus de ce qui tourne déjà sur le serveur. Compiler sur votre poste ou dans votre intégration continue, puis ne déposer que le résultat, évite ce pic.
Simafri
Parlons de votre projet
Dites-nous en deux mots ce qu'il vous faut : on revient vers vous rapidement.
Merci ! Votre demande a bien été envoyée. Nous vous répondrons rapidement.
Vous préférez l'email ? Écrivez-nous à support@simafri.com.