htop expliqué, partie 2 : le load average
Après une première partie consacrée à la notion d’uptime, voici la seconde partie traduite de l’excellent article htop explained : Explanation of everything you can see in htop/top on Linux (1er sur Hacker News, 1er sur /r/sysadmin, 2nd sur /r/linux), traduit avec l’accord de son auteur Pēteris Ņikiforovs, article présentant la commande htop et les notions de base d’un système GNU/Linux présentées par ce programme.
Aujourd’hui : le load average (charge moyenne du système).
Load average
En plus de l’uptime, il y avait aussi 3 nombres qui représentent le load average.
$ uptime 12:59:09 up 32 min, 1 user, load average: 0.00, 0.01, 0.03
Ils sont pris depuis le fichier /proc/loadavg. Si vous jetez un oeil à la sortie de strace, vous verrez que ce fichier est aussi ouvert.
$ cat /proc/loadavg 0.00 0.01 0.03 1/120 1500
Les trois premières colonnes représentent la charge moyenne du système durant les 1, 5 et 15 minutes précédentes. La quatrième colonne montre le nombre de processus s’exécutant en ce moment et le nombre total de processus. La dernière colonne affiche le dernier identifiant (ID) de processus utilisé.
Commençons avec le dernier nombre.
Quand vous lancez un nouveau processus, il lui est assigné un numéro identifiant (ID). Les IDs de processus en général sont croissants, à moins qu’eils soient épuisés et sont ré-utilisés. Le processus avec l’ID 1 appartient à /sbin/init, lequel est lancé au moment du démarrage du système.
Jetons de nouveau un oeil au contenu du /proc/loadavg et exécutons ensuite la commande sleep en arrière-plan. Quand il est lancé en arrière-plan, son ID de processus sera affiché.
$ cat /proc/loadavg 0.00 0.01 0.03 1/123 1566 $ sleep 10 & [1] 1567
Donc le 1/123 signifie qu’il y a un processus s’exécutant ou prêt à être exécuté à ce moment et qu’il y a 123 processus au total.
Quand vous exécutez htop et que vous ne voyez qu’un seul processus, cela signifie qu’il s’agit du processus htop lui-même.
Si vous exécutez sleep 30 et que vous exécutez htop de nouveau, vous constaterez qu’il n’y a qu’un seul processus en cours d’exécution. C’est parce que sleep ne s’exécute pas, il dort ou tourne au ralenti (idling) ou en d’autres mots attend que quelque chose se produise. Un processus en cours d’exécution est un processus qui s’exécute en ce moment sur le CPU physique ou attend son tour pour s’exécuter sur le CPU.
Si vous exécutez cat /dev/urandom > /dev/null qui génère de façon répétée des octets aléatoires et les écrit vers un fichier spécial depuis lequel on ne peut jamais lire, vous verrez qu’il y a maintenant deux processus en cours d’exécution.
$ cat /dev/urandom > /dev/null & [1] 1639 $ cat /proc/loadavg 1.00 0.69 0.35 2/124 1679
Donc nous avons maintenant deux processus (la génération de nombres aléatoires et le cat qui lit le contenu de /proc/loadavg) et vous remarquerez que les load averages ont augmenté.
Le load average représente la charge du système moyenne pendant une période de temps.
Le nombre du load est calculé en comptant le nombre de processus en cours d’exécution (s’exécutant en ce moment ou en attente d’exécution) et les processus non-interruptibles (attente d’accès au disque ou activité réseau). Donc c’est simplement un nombre de processus.
Les load averages sont donc le nombre moyen de ces processus durant les 1, 5 et 15 dernières minutes, n’est-ce pas ?
En fait ça n’est pas aussi simple que ça.
Le load average est la moyenne exponentiellement amortie/pondérée en mouvement du chiffre du load. Dixit Wikipedia (en) :
Mathématiquement parlant, toutes les trois valeurs créent une moyenne de la charge système depuis le démarrage du système. Elles se désagrègent exponentiellement mais elles se désagrègent à des vitesses différentes. Donc, la charge sur une minute va ajouter 63% de charge de la dernière minute, plus 37% de la charge depuis le démarrage en excluant la dernière minute. Donc, il n’est pas techniquement juste que la charge sur une minute inclut l’activité des 60 dernières secondes (puisqu’elle inclut 37% du passé), mais qui inclut majoritairement la dernière minute.
C’est ce que vous attendiez ?
Retournons à notre génération des nombres aléatoires.
$ cat /proc/loadavg 1.00 0.69 0.35 2/124 1679
Bien que techniquement incorrecte, c’est la façon dont je simplifie les load averages pour en parler plus facilement.
Dans ce cas, la génération de nombres aléatoires est limitée par le CPU, donc le load average de la dernière minute est 1.00 ou en moyenne un processus en cours d’exécution.
Comme il n’y a qu’un CPU sur mon système, l’utilisation CPU est de 100% puisque mon CPU ne peut exécuter qu’un processus à la fois.
Si j’avais deux coeurs, mon utilisation CPU serait de 50% puisque mon ordinateur peut exécuter deux processus en même temps. Le load average d’un ordinateur avec deux coeurs qui a 100% d’utilisation CPU serait de 2.00.
Vous pouvez voir le nombre de coeurs ou de CPUs dans le coin en haut à gauche de htop ou en exécutant nproc.
Parce que le chiffre du load inclut également les processus dans des états non-interruptibles, lesquels n’ont pas beaucoup d’effet sur l’utilisation CPU, il n’est pas tout à fait correct de déduire l’utilisation CPU depuis les load averages comme je l’ai fait. Cela explique également pourquoi vous pourriez constater un load average élevé mais peut de charge sur le CPU.
Mais il y a des outils comme mpstat qui peuvent montrer l’utilisation CPU instantanée.
$ sudo apt install sysstat -y $ mpstat 1 Linux 4.4.0-47-generic (hostname) 12/03/2016 _x86_64_ (1 CPU) 10:16:20 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 10:16:21 PM all 0.00 0.00 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:16:22 PM all 0.00 0.00 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:16:23 PM all 0.00 0.00 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 # ... # kill cat /dev/urandom # ... 10:17:00 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 10:17:01 PM all 1.00 0.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 97.00 10:17:02 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Pourquoi utilisons-nous les load averages alors ?
$ curl -s https://raw.githubusercontent.com/torvalds/linux/v4.8/kernel/sched/loadavg.c | head -n 7 /* * kernel/sched/loadavg.c * * This file contains the magic bits required to compute the global loadavg * figure. Its a silly number but people think its important. We go through * great pains to make it work on big machines and tickless kernels. */
Traduction du commentaire dans le fichier source : Ce fichier contient des bits magiques requis pour calculer le chiffre du loadavg global. C’est un nombre idiot mais les gens pensent que c’est important.Nous avons de grandes difficultés à le faire marcher sur les grosses machines et les noyaux tickless.
Ce sera tout pour aujourd’hui J’espère que comme moi vous aurez appris des éléments sur le load average de votre système. Nous continuerons cette série dès lundi avec les processus dans htop.