Aller au contenu
Administration Linux medium

Diagnostiquer les problèmes de performance Linux

22 min de lecture

Votre serveur Linux est lent et vous ne savez pas par où commencer ? Ce guide vous apprend à diagnostiquer rapidement les problèmes de performance en utilisant la méthode USE (Utilization, Saturation, Errors). En 10 minutes, vous saurez identifier si le problème vient du CPU, de la mémoire, du disque ou du réseau — et quelles commandes utiliser pour le confirmer.

Vous apprendrez à :

  • Comprendre les 4 types de contention qui ralentissent un serveur
  • Appliquer la méthode USE de manière systématique
  • Interpréter les métriques avec les bonnes commandes
  • Corriger les problèmes les plus courants

Imaginez un serveur comme une cuisine de restaurant. Quand tout va bien, les plats sortent régulièrement. Mais si le chef est débordé (CPU), s’il manque de plans de travail (mémoire), si le frigo est trop lent à ouvrir (disque), ou si les serveurs se bousculent dans le couloir (réseau), tout ralentit.

En informatique, on appelle ça une contention : une ressource est sollicitée au-delà de ses capacités, créant une file d’attente.

Un serveur exécute des processus (des programmes en cours d’exécution). Chaque processus a besoin de ressources pour fonctionner :

  • Du temps CPU pour effectuer des calculs
  • De la mémoire RAM pour stocker ses données temporaires
  • Des accès disque pour lire/écrire des fichiers
  • De la bande passante réseau pour communiquer

Quand trop de processus demandent la même ressource en même temps, ils doivent faire la queue. C’est cette attente qui crée la lenteur.

Avant de plonger dans les commandes, comprenons ce qui peut mal tourner sur chaque ressource.

Les 4 types de contention et leurs outils de diagnostic

Le CPU (Central Processing Unit) est le “cerveau” de l’ordinateur. Il exécute toutes les instructions des programmes. Quand le CPU est saturé, tout devient lent car les processus doivent attendre leur tour pour être exécutés.

Signes révélateurs : applications qui “rament”, temps de réponse élevé, ventilateurs qui tournent fort.

La RAM (Random Access Memory) est la mémoire à court terme du serveur. Les programmes y stockent les données qu’ils utilisent activement. Quand elle est pleine, Linux utilise le swap (espace disque utilisé comme mémoire de secours), ce qui est 100 à 1000 fois plus lent.

Signes révélateurs : swap utilisé, processus tués automatiquement (OOM-Killer), lenteur soudaine.

Le disque stocke les données de façon permanente (fichiers, bases de données, logs). Les opérations disque sont naturellement plus lentes que la RAM. Quand le disque est saturé, même les opérations simples prennent du temps.

Signes révélateurs : fichiers longs à ouvrir, bases de données lentes, %iowait élevé dans les métriques.

Le réseau permet au serveur de communiquer avec l’extérieur (utilisateurs, autres serveurs, APIs). Quand la bande passante est saturée ou mal configurée, les connexions échouent ou sont très lentes.

Signes révélateurs : timeouts, connexions refusées, téléchargements lents.

ContentionSymptômes typiquesCauses fréquentes
CPUProcessus lents, latence élevéeTrop de processus, calculs intensifs
MémoireSwap actif, OOM-KillerApplications gourmandes, fuites mémoire
DisqueLecture/écriture lente, %iowait élevéBase de données non optimisée, logs excessifs
RéseauConnexions refusées, timeoutsBande passante saturée, attaques DDoS

La méthode USE (Utilization, Saturation, Errors), créée par Brendan Gregg, expert performance chez Netflix, propose d’analyser chaque ressource selon 3 critères :

La méthode USE appliquée aux ressources système

CritèreQuestion à poserCe que ça révèle
U - UtilizationQuel % de la ressource est utilisé ?Si proche de 100%, elle est saturée
S - SaturationY a-t-il une file d’attente ?Des processus attendent la ressource
E - ErrorsY a-t-il des erreurs ?Problèmes matériels ou de configuration

Avant d’analyser chaque ressource, parlons du load average — la métrique la plus connue mais aussi la plus mal comprise.

Le load average (charge moyenne) est un nombre qui représente combien de travail le système doit effectuer. Plus précisément, c’est le nombre moyen de processus qui :

  1. S’exécutent actuellement sur un CPU
  2. Attendent un CPU disponible
  3. Attendent une opération disque (I/O)
Fenêtre de terminal
uptime
Fenêtre de terminal
11:05:07 up 15 days, 5:57, 1 user, load average: 2.70, 2.40, 2.07

Le load average montre le nombre de processus qui sont soit en exécution, soit en attente du CPU, sur 3 périodes :

  • 1ère valeur (2.70) : dernière minute (charge actuelle)
  • 2ème valeur (2.40) : 5 dernières minutes (tendance court terme)
  • 3ème valeur (2.07) : 15 dernières minutes (tendance long terme)

Comment lire cette tendance ?

  • Si la 1ère valeur > 3ème valeur → La charge augmente (pic en cours)
  • Si la 1ère valeur < 3ème valeur → La charge diminue (retour à la normale)
  • Si les 3 valeurs sont proches → Charge stable

La règle d’or : divisez par le nombre de cœurs CPU.

Pourquoi ? Parce qu’un serveur avec 4 cœurs peut exécuter 4 processus en parallèle. Un load de 4 sur un serveur 4 cœurs signifie que chaque cœur travaille à 100% — c’est la limite avant que des processus ne commencent à attendre.

Fenêtre de terminal
nproc
4

Cette commande affiche le nombre de cœurs CPU disponibles.

Sur un serveur 4 cœurs :

Load averageCalculInterprétation
2.02.0 / 4 = 0.5✅ 50% d’utilisation, tout va bien
4.04.0 / 4 = 1.0⚠️ 100% utilisé, à surveiller
8.08.0 / 4 = 2.0🔴 Surcharge, des processus attendent

Le CPU est souvent le premier suspect quand un serveur est lent. Voyons comment vérifier s’il est réellement en cause.

La commande mpstat (Multi-Processor Statistics) montre comment le CPU répartit son temps entre différentes activités :

Fenêtre de terminal
mpstat -P ALL 1 3

Décortiquons cette commande :

  • mpstat : affiche les statistiques CPU
  • -P ALL : pour tous les cœurs (pas seulement la moyenne)
  • 1 : rafraîchir toutes les 1 seconde
  • 3 : pendant 3 itérations
Fenêtre de terminal
CPU %usr %sys %iowait %idle
all 75.2 10.3 8.5 6.0
0 80.1 10.5 5.2 4.2
1 70.3 10.1 11.8 7.8

Que signifie chaque colonne ?

Le CPU divise son temps en plusieurs catégories. Imaginez une journée de travail :

MétriqueAnalogieSignification techniqueSeuil d’alerte
%usrTravail productifTemps passé sur vos applications (MySQL, Nginx, etc.)> 80% constant
%sysRéunions internesTemps passé sur le noyau Linux (gestion mémoire, réseau)> 20%
%iowaitAttente du courrierCPU inactif car il attend le disque> 10%
%idlePause caféCPU qui ne fait rien, disponible< 10% = surcharge
Fenêtre de terminal
top -o %CPU

Appuyez sur 1 pour voir chaque cœur, q pour quitter.

Vérification : Le processus en haut consomme-t-il plus de 90% ?

Fenêtre de terminal
vmstat 1 5
Fenêtre de terminal
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
7 0 0 102400 51200 512000 0 0 5 10 200 400 75 10 5 10 0

La colonne r est clé : elle montre les processus en attente du CPU.

  • r ≤ nombre de cœurs → OK
  • r > nombre de cœurs → Saturation CPU
  1. Identifier le processus fautif avec top et vérifier s’il est normal qu’il consomme autant.

  2. Réduire la priorité d’un processus non critique :

    Fenêtre de terminal
    renice +10 -p <PID>
  3. Limiter les ressources avec cgroups ou taskset :

    Fenêtre de terminal
    taskset -c 0,1 mon_processus
  4. Optimiser l’application : profiler avec perf top pour trouver les fonctions gourmandes.

La mémoire RAM est cruciale pour les performances. Contrairement au CPU qui peut “faire la queue”, quand la RAM est pleine, Linux doit prendre des mesures drastiques.

Avant de regarder les commandes, comprenons comment Linux utilise la RAM :

  1. Mémoire applicative : utilisée par vos programmes (MySQL, Nginx, etc.)
  2. Buffer/Cache : Linux utilise la RAM “libre” pour accélérer les accès disque
  3. Swap : espace disque utilisé comme “RAM de secours” (très lent)
Fenêtre de terminal
free -h

L’option -h affiche les valeurs en format lisible (Gi, Mi) au lieu d’octets.

Fenêtre de terminal
total used free shared buff/cache available
Mem: 16Gi 12Gi 1.5Gi 145Mi 2.5Gi 3.2Gi
Swap: 2.0Gi 512Mi 1.5Gi

Décryptage ligne par ligne :

ColonneSignificationDans notre exemple
totalRAM totale installée16 Go
usedRAM utilisée (apps + cache)12 Go
freeRAM complètement libre1.5 Go
buff/cacheRAM utilisée pour le cache disque2.5 Go
availableRAM réellement disponible pour de nouvelles apps3.2 Go

Ce qui compte vraiment :

  • available (pas free !) : mémoire réellement disponible pour les applications
  • Swap used : si > 0, la mémoire RAM est insuffisante
Fenêtre de terminal
vmstat 1 5

Regardez les colonnes si (swap-in) et so (swap-out) :

Fenêtre de terminal
---swap--
si so
10 35
  • si/so > 0 → Le système utilise le swap = mémoire insuffisante
  • so élevé → Écriture vers le swap, très lent
Fenêtre de terminal
dmesg | grep -i oom
Fenêtre de terminal
Out of memory: Kill process 1234 (java) score 987
Killed process 1234 (java) total-vm:20480000kB

Si vous voyez ce message, le noyau a tué un processus par manque de mémoire. C’est critique.

  1. Identifier les consommateurs :

    Fenêtre de terminal
    ps aux --sort=-%mem | head -10
  2. Ajouter de la RAM si la charge est légitime.

  3. Limiter les caches applicatifs (MySQL innodb_buffer_pool_size, Java Xmx).

  4. Ajouter du swap sur SSD en cas d’urgence :

    Fenêtre de terminal
    dd if=/dev/zero of=/swapfile bs=1G count=4
    mkswap /swapfile && swapon /swapfile

Le disque est souvent le composant le plus lent d’un serveur. Même un SSD est 1000 fois plus lent que la RAM. Quand le disque est saturé, tout le système en souffre.

Chaque fois qu’un programme lit ou écrit un fichier, il fait une opération I/O (Input/Output). Ces opérations incluent :

  • Lecture de fichiers de configuration
  • Écriture de logs
  • Requêtes de base de données
  • Swap (mémoire → disque)
Fenêtre de terminal
iostat -dx 2 3

Décortiquons cette commande :

  • iostat : statistiques d’entrées/sorties
  • -d : afficher les stats disque (pas CPU)
  • -x : affichage étendu avec plus de métriques
  • 2 : rafraîchir toutes les 2 secondes
  • 3 : pendant 3 itérations
Fenêtre de terminal
Device r/s w/s rkB/s wkB/s %util
sda 100 80 4000 2048 95.00

Que signifie chaque colonne ?

ColonneSignificationDans notre exemple
r/sLectures par seconde100 ops/s
w/sÉcritures par seconde80 ops/s
rkB/sDébit lecture (Ko/s)4 Mo/s
wkB/sDébit écriture (Ko/s)2 Mo/s
%util% du temps où le disque travaille95%

La colonne %util est clé :

  • < 70% → OK
  • 70-90% → À surveiller
  • > 90% → Goulot d’étranglement
Fenêtre de terminal
iotop
Fenêtre de terminal
Total DISK READ: 12.00 M/s | Total DISK WRITE: 3.00 M/s
PID USER DISK READ DISK WRITE COMMAND
2345 mysql 8.00 M/s 1.00 M/s mysqld
Fenêtre de terminal
smartctl -a /dev/sda | grep -E "Reallocated|Error"
Fenêtre de terminal
Reallocated_Sector_Ct: 12
Reported_Uncorrect: 3

Si ces valeurs augmentent, le disque est en train de mourir.

  1. Migrer vers un SSD/NVMe pour les workloads intensifs.

  2. Optimiser les requêtes de base de données (index manquants).

  3. Activer le caching applicatif (Redis, Varnish).

  4. Changer le scheduler IO pour les SSD :

    Fenêtre de terminal
    echo none > /sys/block/sda/queue/scheduler

Le réseau connecte votre serveur au monde extérieur. Un problème réseau peut ressembler à un problème applicatif (timeouts, lenteurs), ce qui le rend parfois difficile à identifier.

ProblèmeSymptômeCause typique
Bande passante saturéeTransferts lentsTrop de trafic, attaque DDoS
Paquets perdusConnexions instablesRéseau physique défaillant
Connexions refusées”Connection refused”Port fermé, limite atteinte
Latence élevéeRéponses lentesRéseau congestionné, routage
Fenêtre de terminal
ip -s link show eth0

Cette commande affiche les statistiques de l’interface réseau eth0 (adaptez le nom à votre serveur : ens3, enp0s3, etc.).

Fenêtre de terminal
RX: bytes 1234567890 packets 12345678
TX: bytes 9876543210 packets 9876543
RX errors 0 dropped 10
TX errors 0 dropped 2

Décryptage :

LigneSignificationÀ surveiller
RXRéception (trafic entrant)Volume de données reçues
TXTransmission (trafic sortant)Volume de données envoyées
errorsPaquets corrompus> 0 = problème physique
droppedPaquets abandonnés> 0 = saturation ou config
Fenêtre de terminal
ss -s

Cette commande (socket statistics) donne un résumé des connexions réseau.

Fenêtre de terminal
TCP: 145 (estab 120, closed 15, timewait 5)

Que signifient ces états ?

ÉtatSignificationProblème si…
estabConnexions activesNombre très élevé (> 10000)
closedConnexions fermées récemmentNormal
timewaitEn attente de fermeture complète> 1000 = fuite de connexions
Fenêtre de terminal
iftop -i eth0

Ou pour voir par processus :

Fenêtre de terminal
nethogs eth0
  1. Optimiser les paramètres TCP :

    Fenêtre de terminal
    sysctl -w net.ipv4.tcp_tw_reuse=1
    sysctl -w net.ipv4.tcp_fin_timeout=15
  2. Limiter les connexions avec iptables/firewalld.

  3. Utiliser un CDN pour le contenu statique.

  4. Augmenter la bande passante si légitime.

Certaines commandes ne sont pas installées par défaut. Voici comment les obtenir :

Fenêtre de terminal
sudo apt update
sudo apt install sysstat iotop nethogs iftop smartmontools

Ce que chaque paquet apporte :

PaquetCommandesUsage
sysstatmpstat, iostat, sarMétriques CPU, disque, historique
iotopiotopI/O par processus (comme top pour le disque)
nethogsnethogsBande passante par processus
iftopiftopTrafic réseau en temps réel
smartmontoolssmartctlSanté des disques (S.M.A.R.T.)
RessourceCommande rapideCe qui indique un problème
CPUuptimeLoad > nombre de cœurs
CPUmpstat 1%idle < 10%
Mémoirefree -havailable < 10% total
Mémoirevmstat 1si/so > 0
Disqueiostat -dx 1%util > 90%
Disquevmstat 1wa > 20%
Réseauip -s linkerrors/dropped > 0
Réseauss -stimewait élevé
SymptômeCause probableSolution
Load average élevé, CPU idle élevéAttente IO (disque lent)Vérifier iostat, migrer sur SSD
Swap utilisé, OOM dans dmesgMémoire insuffisanteAjouter RAM ou limiter applications
%iowait élevéBase de données non optimiséeAjouter des index, caching
Connexions refuséesLimite de fichiers atteinteulimit -n et /etc/security/limits.conf
  • La méthode USE (Utilization, Saturation, Errors) permet un diagnostic systématique.
  • Le load average doit être divisé par le nombre de cœurs pour être interprété.
  • %iowait élevé indique un problème disque, pas CPU.
  • Swap actif = mémoire insuffisante, à corriger rapidement.
  • %util > 90% sur iostat signifie que le disque est le goulot d’étranglement.
  • Surveillez proactivement avec Prometheus/Grafana pour anticiper les problèmes.