Architecture du noyau Linux : ordonnancement, mémoire, VFS, démarrage et diagnostic
EdwardMoon
Le noyau Linux est la couche centrale du système qui permet aux applications de partager en sécurité le CPU, la mémoire, les disques et le réseau. Les processus demandent ces services via l'ABI des appels système, plutôt que d'appeler directement les fonctions du noyau. Celui-ci vérifie les permissions et l'état des ressources avant d'effectuer les opérations matérielles.
Cet article va au-delà de l'étiquette « noyau monolithique ». Des commandes observables sur un véritable serveur relient ordonnancement, mémoire virtuelle, VFS, démarrage, modules et panics. Il explique aussi pourquoi le diagnostic doit précéder l'application de recommandations sysctl non étayées.

Vue d'ensemble de l'architecture du noyau Linux
Linux est un noyau monolithique : les composants essentiels aux performances, dont l'ordonnanceur, la gestion mémoire, VFS, la pile réseau et la plupart des pilotes, s'exécutent dans l'espace d'adressage du noyau. Des modules chargeables permettent aussi d'ajouter ou de retirer des fonctions à l'exécution. Les niveaux de privilège du CPU et les protections des tables de pages séparent les espaces utilisateur et noyau.
| Couche | Composants courants | Manifestation des incidents |
|---|---|---|
| Espace utilisateur | Shells, serveurs web, bases de données, libc | Arrêts de processus, latence, codes d'erreur |
| Frontière des appels système | openat, read, write, mmap, clone | Valeurs errno telles que EACCES, ENOMEM et EIO |
| Espace noyau | Ordonnanceur, MM, VFS, réseau, LSM, pilotes | Avertissements, Oops, panics, pression sur les ressources |
| Matériel | CPU, RAM, périphériques blocs, cartes réseau | Erreurs matérielles, erreurs d'entrées-sorties, anomalies d'interruptions |
Identifier le noyau en cours et l'environnement
uname -a
cat /etc/os-release
cat /proc/cmdline
systemd-detect-virt
cat /proc/sys/kernel/tainted
Une dernière valeur non nulle peut indiquer un noyau marqué tainted en raison d'un module propriétaire, d'un retrait forcé de module, d'une erreur matérielle ou d'une autre condition. N'interprétez pas le nombre seul : consultez les définitions officielles des bits taint avec les journaux du noyau.
Principaux sous-systèmes du noyau
| Sous-système | Rôle | Points d'observation courants |
|---|---|---|
| Ordonnanceur | Décide quand et sur quel CPU les tâches exécutables s'exécutent | ps, schedstat, perf sched |
| Gestion mémoire | Gère les adresses virtuelles, défauts de page, cache de pages, récupération mémoire et politiques NUMA | /proc/meminfo, vmstat |
| VFS | Fournit une API de fichiers et un modèle d'objets communs aux systèmes de fichiers | findmnt, stat, /proc/filesystems |
| Réseau | Gère les sockets, TCP/IP, le routage, Netfilter et les files des périphériques | ss, ip, nstat |
| Sécurité | Contrôle les accès via DAC, capabilities, LSM, seccomp et mécanismes associés | id, getcap, ausearch |
| Pilotes | Détecte les bus et périphériques et les relie aux interfaces communes du noyau | lspci -k, lsmod, modinfo |
La frontière des appels système
Les applications utilisent couramment les fonctions d'encapsulation de libc, mais cette bibliothèque n'est pas obligatoire. Elles peuvent invoquer directement les instructions d'appel système et conventions propres à l'architecture. Le noyau vérifie le numéro d'appel, les arguments et les permissions avant d'exécuter l'implémentation. Il est donc plus exact de dire que glibc fournit généralement des fonctions pratiques que d'affirmer qu'elle traite les appels système.
Suivre l'ouverture de fichiers avec strace
strace -f -e trace=openat,read,write,close cat /etc/hostname
# Afficher uniquement les statistiques résumées
strace -c cat /etc/hostname
Sur un système glibc moderne, l'ouverture d'un fichier peut apparaître comme un appel de la famille openat() plutôt que open(). Ne supposez pas qu'une fonction utilisateur et l'appel système sous-jacent portent toujours le même nom.
Ordonnancement CFS et EEVDF
L'ordonnancement Linux des tâches ordinaires est préemptif ; qualifier CFS de non préemptif est incorrect. À partir du noyau 6.6, l'ordonnancement équitable a également commencé sa transition du modèle de temps virtuel de CFS vers EEVDF. Les rétroportages des distributions peuvent modifier le comportement : consultez la version réelle du noyau et la documentation du fournisseur plutôt que de déduire le fonctionnement d'un nom.
uname -r
ps -eo pid,tid,psr,cls,pri,ni,stat,comm --sort=-pri | head -n 20
chrt -p $$
cat /proc/$$/sched | head -n 30
Attention : ne confondez pas CFS/EEVDF pour les tâches ordinaires avec les politiques temps réel SCHED_FIFO, SCHED_RR ou l'ordonnancement à échéance. Des priorités temps réel incorrectes peuvent priver de CPU les shells d'administration et les démons essentiels ; ne les modifiez pas arbitrairement en production.
Mémoire virtuelle et cache de pages
La MMU et les tables de pages associent les adresses virtuelles d'un processus à la mémoire physique ou aux fichiers. Mémoire anonyme, mappings de fichiers, cache de pages, slab, récupération et swap interagissent. Ne diagnostiquez pas un épuisement mémoire à partir de la seule colonne free de free : examinez ensemble la mémoire disponible, le swap, les défauts de page, la récupération et PSI.
free -h
grep -E 'MemAvailable|Cached|Swap|Slab|SReclaimable' /proc/meminfo
vmstat 1 10
cat /proc/pressure/memory
ps -eo pid,comm,rss,vsz,%mem --sort=-rss | head -n 20
Examiner l'espace d'adressage d'un processus
PID=1234
pmap -x "$PID" | tail -n 20
cat "/proc/$PID/status" | grep -E 'VmRSS|VmSwap|Threads'
cat "/proc/$PID/smaps_rollup"
VmRSS inclut les pages partagées ; l'additionner entre processus peut donc surestimer la mémoire physique réellement utilisée. Utilisez smaps_rollup si vous avez besoin du PSS, qui répartit le coût des pages partagées.
VFS et entrées-sorties de fichiers
VFS offre une interface commune à ext4, XFS, Btrfs, NFS et d'autres implémentations. Les chemins sont résolus en inodes via le cache dentry, et la table des descripteurs d'un processus référence les objets fichier du noyau. Ces références expliquent pourquoi supprimer un chemin ne libère pas les blocs tant qu'un processus conserve le fichier ouvert.
cat /proc/filesystems
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS
stat /var/log/messages
sudo lsof +L1
cat /proc/sys/fs/file-nr
Pour les erreurs d'espace disque, distinguez les blocs, les inodes et les fichiers supprimés encore ouverts. Consultez le guide de diagnostic No space left on device pour la procédure détaillée.
Démarrage et initramfs
Un système UEFI démarre généralement par le firmware, le chargeur, le noyau et l'initramfs, le véritable système de fichiers racine, puis PID 1. Souvent fourni comme archive cpio compressée, l'initramfs constitue l'espace utilisateur initial. Il prépare les modules et outils nécessaires au stockage, au chiffrement, à LVM ou au RAID avant le passage à la véritable racine.
- Le firmware sélectionne une entrée et exécute un chargeur ou un stub EFI.
- Le noyau initialise les CPU, la mémoire, les interruptions et les premiers pilotes.
- L'espace utilisateur initial de l'initramfs prépare le véritable périphérique racine.
- Après switch_root, PID 1 sur la véritable racine démarre les services et l'environnement de connexion.
cat /proc/cmdline
systemd-analyze time
systemd-analyze critical-chain
journalctl -b -k -p warning
# Examiner l'initramfs actuel sous RHEL et Rocky Linux
lsinitrd "/boot/initramfs-$(uname -r).img" | less
Régénérer l'initramfs ou modifier GRUB peut empêcher le démarrage. Pour un serveur distant, préparez un accès console, un ancien noyau, des sauvegardes amorçables et une procédure de récupération avant de suivre la procédure documentée par la distribution.
Diagnostiquer les modules et pilotes
Les modules disposent de privilèges élevés dans le noyau ; leurs pannes ont donc un impact différent de celles des programmes utilisateur. Si un périphérique manque, examinez-le, son pilote associé, les signatures des modules et les journaux avant de décharger ou recharger des modules.
lspci -nnk
lsmod | head
modinfo <module_name>
journalctl -k -b | grep -Ei 'firmware|module|driver|taint|error'
cat /proc/sys/kernel/tainted
modprobe -r peut détacher des pilotes de stockage ou réseau actifs. En production, ne l'exécutez pas avant d'avoir vérifié les dépendances et l'impact, prévu une maintenance et sécurisé l'accès console.
Diagnostiquer un kernel panic
Un Oops peut laisser le noyau continuer après avoir consigné une erreur, mais la fiabilité du système peut déjà être compromise. Un kernel panic signifie que le noyau estime ne plus pouvoir poursuivre normalement. Selon la configuration, il peut s'arrêter, redémarrer après un délai ou basculer vers un noyau de capture kdump. Il ne s'agit pas toujours d'un simple arrêt de protection.
journalctl -k -b -1 -p warning..alert
last -x | head -n 20
sudo kdumpctl status
sysctl kernel.panic kernel.panic_on_oops
ls -lh /var/crash
Procédure d'investigation d'un panic
- Identifier les modifications récentes de noyau, pilotes, firmware ou matériel et leur chronologie.
- Conserver l'écran complet du panic et la première erreur depuis la console ou l'administration distante.
- Si kdump était configuré, collecter vmcore et les symboles de débogage de la compilation exacte du noyau.
- Comparer le comportement avec l'ancien noyau pour distinguer une régression d'un problème matériel.
- Ne pas déclencher volontairement un panic sur un serveur de production.
sysctl : mesurer, formuler une hypothèse et préparer le retour arrière
sysctl --system et sysctl -p appliquent des paramètres au noyau actif. Ce ne sont ni des vérifications syntaxiques ni des commandes de diagnostic en lecture seule. Remplacez le chemin ci-dessous par un fichier local existant. Si une modification est nécessaire, appliquez-la séparément lors d'une maintenance, après avoir consigné les valeurs initiales et préparé le retour arrière.
Il n'existe pas de configuration sysctl universelle pour tous les serveurs web. Les goulets d'étranglement dépendent du noyau, de la mémoire, des connexions, des files applicatives et des limites de conteneurs. Modifier simultanément tcp_tw_reuse, les plages de ports, les backlogs et swappiness sans mesure rend la cause plus difficile à isoler.
# 1. Lire les valeurs actuelles et les indicateurs associés.
sysctl vm.swappiness net.core.somaxconn net.ipv4.ip_local_port_range
ss -s
vmstat 1 10
# 2. Examiner les fichiers en lecture seule, sans appliquer leurs valeurs.
sudo find /etc/sysctl.d /run/sysctl.d /usr/local/lib/sysctl.d /usr/lib/sysctl.d \
-maxdepth 1 -type f -name '*.conf' -print 2>/dev/null
sudo cat /etc/sysctl.conf
# 3. Choisir un fichier et comparer ses paramètres aux valeurs actuelles du noyau.
sudo cat /etc/sysctl.d/99-local.conf
sysctl vm.swappiness net.core.somaxconn net.ipv4.ip_local_port_range
Ces commandes fournissent une méthode d'observation avant et après modification, pas des valeurs de réglage recommandées. Appliquez une seule modification de production à la fois et consignez les critères de réussite — latences p95/p99, taux d'erreur, retransmissions et pression mémoire — ainsi que les valeurs permettant un retour arrière immédiat.
Un diagnostic du noyau en dix minutes
# 1. Version, démarrage et état taint
uname -r
uptime
cat /proc/sys/kernel/tainted
# 2. Pression sur le CPU, la mémoire et les entrées-sorties
vmstat 1 10
cat /proc/pressure/{cpu,memory,io}
# 3. Avertissements récents du noyau et unités en échec
journalctl -k -b -p warning..alert
systemctl --failed
# 4. Systèmes de fichiers et fichiers supprimés encore ouverts
df -hT
df -i
sudo lsof +L1
Ne commencez pas le diagnostic par des réglages. Alignez les chronologies, déterminez la ressource saturée, identifiez si les avertissements du noyau précèdent les erreurs applicatives ou l'inverse, puis formulez une hypothèse reproductible.
Corriger les idées reçues
| Affirmation trompeuse | Explication correcte |
|---|---|
| CFS est un ordonnanceur non préemptif | L'ordonnancement ordinaire Linux est préemptif et la transition vers EEVDF a commencé avec 6.6. |
| glibc traite les appels système | libc fournit généralement l'encapsulation ; le noyau effectue la transition de privilèges et le traitement réel. |
| Peu de mémoire libre signifie un épuisement mémoire | Examiner ensemble la mémoire disponible, la récupération, le swap, PSI et les indicateurs applicatifs. |
| Un panic arrête toujours immédiatement le système | L'arrêt, le redémarrage et la capture dépendent du délai panic et de kdump. |
| Les mêmes réglages sysctl conviennent à tous les serveurs | Mesurer selon le noyau, le matériel et le trafic, puis valider les modifications une par une. |
Documentation officielle et lectures complémentaires
- Documentation de l'ordonnanceur Linux EEVDF
- Gestion mémoire Linux
- Présentation de VFS Linux
- Documentation Linux /proc/sys/kernel
- Documentation Linux kdump
- Isoler les environnements Python en espace utilisateur
Conclusion
Comprendre l'architecture du noyau Linux consiste à relier les symptômes utilisateur aux appels système, à l'ordonnancement, à la mémoire, à VFS et aux pilotes, au-delà de la mémorisation des termes. Conservez d'abord les versions et journaux, utilisez les observations pour circonscrire le goulet d'étranglement et validez une modification à la fois avec un plan de retour arrière.