Tom Daluzeau
← Parcours Linux · ressources
Linux · ressources · leçon 1 / 6Ch. 2 · Ressources11 minTerminée

CPU : charge moyenne, utilisation et priorités

Tu sais lire les trois nombres de uptime et les comparer au nombre de cœurs, lire la ligne CPU de top, dire si un processus est limité par le calcul ou par le disque, et régler sa priorité ou les cœurs qu'il a le droit d'utiliser.

Mis à jour le

À recouper avec le cours. Cette leçon a été écrite à partir du plan du chapitre, avant relecture avec les supports. En cas de doute, le cours fait foi.

Pourquoi on voit ça

« L’application est lente. » C’est la plainte la plus fréquente qu’un administrateur reçoit, et elle ne dit rien sur la cause. Quatre ressources peuvent manquer : le processeur, la mémoire, le disque, ou une limite fixée par le système. Ce chapitre t’apprend à trouver laquelle.

On commence par le processeur (CPU), parce que c’est le premier réflexe : on tape uptime ou top et on regarde. Encore faut-il lire correctement ce qui s’affiche. Une charge de 4 peut être excellente ou catastrophique selon la machine.

La charge moyenne

uptime
 14:02:11 up 12 days,  3:41,  2 users,  load average: 0.52, 0.80, 0.91

Les trois nombres de la fin sont la charge moyenne (load average) sur la dernière minute, les 5 dernières minutes et les 15 dernières minutes, dans cet ordre.

La charge, c’est le nombre moyen de processus qui utilisent un cœur ou qui attendent : soit leur tour sur un cœur, soit la fin d’une entrée/sortie sur le disque.

L’image des caisses

Imagine un supermarché. Chaque cœur est une caisse. La charge, c’est le nombre de clients en train de payer plus ceux qui font la queue.

  • 4 caisses, 2 clients : tout le monde passe tout de suite.
  • 4 caisses, 4 clients : toutes les caisses sont occupées, personne n’attend.
  • 4 caisses, 10 clients : 6 personnes font la queue. Ça ralentit.
4 cœurs = 4 caisses file d'attente personne personne 6 clients attendent Charge 2 de la marge Charge 4 plein, sans attente Charge 10 saturé
La charge compte ceux qui passent en caisse et ceux qui attendent. Elle ne veut rien dire sans le nombre de caisses.

La charge seule ne veut donc rien dire. Il faut la comparer au nombre de cœurs :

nproc
4
Charge par rapport au nombre de cœurs Ce que ça veut dire
nettement en dessous la machine a de la marge
à peu près égale tous les cœurs travaillent, pas de file d’attente
au-dessus des processus attendent : la machine est saturée

Lire la tendance

Les trois nombres racontent une histoire. On les lit de gauche (récent) à droite (ancien).

Exemple Lecture
8.12, 3.40, 1.05 la charge monte : le problème vient de commencer
1.05, 3.40, 8.12 la charge baisse : le pic est passé
4.00, 4.10, 3.90 charge stable depuis un quart d’heure

Charge et utilisation : deux choses différentes

L’utilisation du CPU est un pourcentage : la part du temps où le processeur travaille vraiment. La charge est un nombre de processus : la demande, file d’attente comprise.

Les deux ne vont pas toujours ensemble. Comme la charge compte aussi les processus bloqués sur une entrée/sortie, tu peux avoir une charge très haute avec un processeur presque inactif. Dans ce cas, ce n’est pas le calcul qui manque, c’est le disque qui ne suit pas.

Pour faire la différence, il faut regarder à quoi le processeur passe son temps.

La ligne CPU de top

top

En haut de l’écran, la troisième ligne ressemble à ceci :

%Cpu(s): 12.0 us,  3.0 sy,  0.0 ni, 84.5 id,  0.5 wa,  0.0 hi,  0.0 si,  0.0 st

C’est la répartition du temps du processeur, en pourcentage. Quatre champs sont à connaître :

Champ Nom Le processeur passe ce temps…
us user dans les programmes ordinaires (espace utilisateur)
sy system dans le noyau (appels système)
id idle à ne rien faire
wa I/O wait à attendre la fin d’une entrée/sortie

Le champ ni compte le temps passé dans les processus dont on a baissé la priorité avec nice (voir plus bas).

Comment lire :

  • us élevé → une application calcule beaucoup.
  • sy élevé → le noyau travaille beaucoup (énormément d’appels système).
  • id élevé → le processeur a de la marge.
  • wa élevé → le processeur attend le disque. Le problème est côté stockage.
Serveur A : il calcule charge 5 · 2 cœurs us 70 % sy 12 id 18 le processeur travaille : des cœurs en plus aideraient Serveur B : il attend charge 5 · 2 cœurs id 10 wa 80 % : il attend le disque us 6 · sy 4 : presque pas de calcul, des cœurs en plus ne changeraient rien
Même charge, deux causes opposées. La ligne CPU de top dit laquelle.

Sous cette ligne, la liste des processus est triée par consommation de CPU : le coupable est en général tout en haut. Dans la colonne %CPU, 100 correspond à un cœur entier. Un processus à 200 % occupe deux cœurs.

CPU-bound ou I/O-bound

On classe un processus selon ce qui le freine.

Type Ce qui le limite Exemples Signes
CPU-bound la puissance de calcul compression, chiffrement, encodage vidéo us élevé, processus près de 100 %
I/O-bound les entrées/sorties (disque, réseau) sauvegarde, copie de fichiers, base de données qui lit le disque wa élevé, processus à quelques % de CPU
CPU-bound ex. compression calcul, calcul, calcul… us élevé : le processus tourne près de 100 % d'un cœur I/O-bound ex. sauvegarde attente disque attente disque attente disque attente disque wa élevé : quelques % de CPU seulement temps
Les blocs pleins sont le temps passé à calculer. Au second, un processeur plus rapide ne raccourcirait que les petits blocs.

La distinction donne la solution. À un processus CPU-bound, il faut des cœurs plus rapides ou plus nombreux. À un processus I/O-bound, ajouter des cœurs ne sert à rien : il faut un disque plus rapide ou moins d’accès au disque.

La priorité : nice et renice

Quand plusieurs processus veulent le processeur, le noyau partage. Tu peux influencer ce partage avec la valeur nice, la « gentillesse » du processus.

  • L’échelle va de -20 à 19. La valeur par défaut est 0.
  • Plus la valeur est haute, plus le processus est gentil : il laisse passer les autres. Il est donc moins prioritaire.
  • -20 est la priorité la plus forte, 19 la plus faible.
  • Un utilisateur ordinaire peut seulement augmenter la valeur. Les valeurs négatives sont réservées à root.
0 : valeur par défaut valeurs négatives : root seulement tout utilisateur peut monter ici -20 -10 0 10 19 plus prioritaire plus gentil, donc moins prioritaire
Un processus « gentil » laisse passer les autres. Remonter vers la gauche est un privilège de root.

Lancer une commande avec une valeur nice :

nice -n 10 tar czf sauvegarde.tar.gz /var/www

Changer la valeur d’un processus déjà lancé, à partir de son PID :

renice -n 5 -p 1234
1234 (process ID) old priority 0, new priority 5

Dans top, la colonne NI affiche la valeur nice de chaque processus.

La valeur nice ne ralentit pas un processus seul sur la machine. Elle ne joue que lorsqu’il y a concurrence pour le processeur.

L’affinité : taskset

L’affinité est la liste des cœurs sur lesquels un processus a le droit de tourner. Par défaut : tous. Les cœurs sont numérotés à partir de 0.

Voir l’affinité d’un processus :

taskset -cp 1234
pid 1234's current affinity list: 0-3

La modifier (ici, cœurs 0 et 1 seulement) :

taskset -cp 0,1 1234

Lancer une commande directement sur un cœur précis :

taskset -c 2 ./calcul.sh

-c indique qu’on donne une liste de numéros de cœurs, -p qu’on vise un processus existant. À quoi ça sert : réserver des cœurs à une application sensible, ou cantonner un traitement lourd pour qu’il n’envahisse pas toute la machine.

À ne pas confondre : nice règle l’ordre de passage, taskset règle l’endroit où le processus tourne.

À retenir

  • uptime donne la charge moyenne sur 1, 5 et 15 minutes. On la compare toujours au nombre de cœurs (nproc).
  • Charge au-dessus du nombre de cœurs : des processus attendent. Charge ≠ utilisation : la charge compte aussi l’attente du disque.
  • Ligne CPU de top : us programmes, sy noyau, id repos, wa attente d’entrées/sorties.
  • CPU-bound : limité par le calcul (us haut). I/O-bound : limité par le disque ou le réseau (wa haut).
  • nice lance, renice modifie. De -20 (très prioritaire) à 19 (très gentil). Valeurs négatives : root seulement.
  • taskset -cp affiche ou fixe les cœurs autorisés pour un processus.

Entraînement

12 questions, dont 3 à compléter. Tu réponds, on passe à la suivante. La note arrive à la fin.

Cartes · 8

Réviser les cartes ici

Espace : retourner