8. Les démons du noyau

Si vous saisissez la commande ps aux, vous verrez quelque chose ressemblant à ce qui suit :

USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
root         1  0.1  8.0  1284   536   ? S    07:37   0:04 init [2]
root         2  0.0  0.0     0     0   ? SW   07:37   0:00 (kflushd)
root         3  0.0  0.0     0     0   ? SW   07:37   0:00 (kupdate)
root         4  0.0  0.0     0     0   ? SW   07:37   0:00 (kpiod)
root         5  0.0  0.0     0     0   ? SW   07:37   0:00 (kswapd)
root        52  0.0 10.7  1552   716   ? S    07:38   0:01 syslogd -m 0
root        54  0.0  7.1  1276   480   ? S    07:38   0:00 klogd
root        56  0.3 17.3  2232  1156   1 S    07:38   0:13 -bash
root        57  0.0  7.1  1272   480   2 S    07:38   0:01 /sbin/agetty 38400 tt
root        64  0.1  7.2  1272   484  S1 S    08:16   0:01 /sbin/agetty -L ttyS1
root        70  0.0 10.6  1472   708   1 R   Sep 11   0:01 ps aux 

C'est une liste de processus en cours d'exécution sur le système. Les informations proviennent du système de fichiers /proc que j'ai mentionné dans la section précédente. Remarquez que init est le processus numéro un. Les processus 2, 3, 4 et 5 sont kflushd, kupdate, kpiod et kswapd. Il y a quand même quelque chose d'étrange : dans les deux colonnes de la taille virtuelle de stockage (SIZE) et la taille réelle de stockage (Real Storage Size, RSS), ces processus renvoient zéro. Comment un processus peut-il ne pas utiliser de mémoire ?

Il s'agit des démons propres au noyau. La majeure partie du noyau n'apparaît même pas dans la liste des processus, et le seul moyen de connaître la mémoire qu'il utilise est de soustraire la mémoire disponible à la quantité totale de mémoire installée. Les démons du noyau sont démarrés après init, et obtiennent de ce fait des numéros de processus normaux, mais leur code et leurs données n'existent qu'au sein de la zone de mémoire occupée par le noyau.

Les noms des démons du noyau dans la liste sont écrits entre crochets car le système de fichiers /proc ne contient pas d'information sur la ligne de commande utilisée pour lancer ces processus.

Alors, à quoi servent ces démons ? Les versions précédentes de ce document présentaient ici un appel à contribution, car mes connaissances dans ce domaine sont limitées. L'explication (partielle) qui suit est une fusion de différentes réponses à cet appel, pour lesquelles j'ai une grande reconnaissance. Toutes indications, références et corrections sont bienvenues.

Toutes les entrées et sorties sont effectuées via des tampons en mémoire, ce qui accélère grandement les choses. Tout ce qu'un programme écrit peut être conservé en mémoire, puis être écrit sur le disque par blocs plus grands et plus efficaces. C'est le travail des démons kflushd et kupdate.

Très souvent, les processus sont au repos, et ceux qui tournent n'ont pas besoin d'avoir l'intégralité de leur code et de leurs données chargée en mémoire. Cela signifie que l'on peut faire un meilleur usage de notre mémoire vive, en faisait glisser les pages inutilisées des programmes en cours d'exécution vers la ou les partitions d'échange du disque dur. Le transfert des données depuis et vers la mémoire selon les besoins est assuré par kpiod et kswapd. Toutes les secondes environ, kswapd se réveille et vérifie la situation de la mémoire, et, si une page devient nécessaire en mémoire ou que l'on commence à manquer de place, invoque kpiod.

Il peut aussi exister un démon kapmd si vous avez activé la gestion avancée de l'énergie (apm) dans votre noyau.

8.1. Configuration

Le programme update vous permet de configurer kflushd et kswapd. Essayez update -h pour avoir plus d'information.

L'espace d'échange (swap) est mis en service avec swapon et hors service par swapoff. Ce sont les scripts d'initialisation /etc/rc.sysinit ou /etc/rc.d/rc.sysinit qui appellent généralement swapon, lorsque le système démarre. J'ai entendu dire que swapoff était pratique pour économiser l'énergie des ordinateurs portables.

8.2. Exercices

Faites un update -t, notez les commentaires des dernières lignes parlant de « threshold for buffer fratricide » (seuil fratricides des tampons). Voilà un concept bien intriguant ! Enquêtez !

Entrez dans le répertoire /proc/sys/vm et faites un cat sur tous les fichiers s'y trouvant. Voyez ce que vous pouvez en tirer.

8.3. Aller plus loin

Le livre « Le noyau Linux » du projet de documentation Linux (LDP). Suivre les liens dans la section aller plus loin - le noyau Linux.

Le code source du noyau, si vous êtes courageux ! Le programme source de kswapd se trouve dans linux/mm/vmscan.c, ceux de klushd et kupdate se trouvent eux dans linux/fs/buffer.c.