Kernel
| Fiche express | |
|---|---|
| Domaine | Noyau Linux (mémoire, E/S, boot) |
| Paquet doc | kernel-doc
|
| Contexte | Concepts noyau 32/64 bits, historiquement documentés sur RHEL/CentOS 5/6 |
| Voir aussi | Systemctl (services), Chkconfig (services legacy) |
Aide-mémoire sur quelques aspects internes du noyau Linux utiles en exploitation : gestion de la mémoire (zones et OOM killer), scheduler d'entrées/sorties, et support TRIM sur SSD.
Documentation embarquée
Le noyau Linux dispose d'une documentation complète installable localement via le paquet :
yum install kernel-doc # ou dnf sur les distributions récentes
Elle est ensuite disponible dans /usr/share/doc/kernel-doc-<version>/Documentation/.
Cartographie visuelle du noyau (sous-systèmes et dépendances) : http://www.makelinux.net/kernel_map/
Gestion de la mémoire
La gestion de la mémoire dans Linux est prise en charge par le sous-système appelé « VM » (Virtual Memory).
Sur un système Intel 32 bits, la mémoire physique est scindée en plusieurs zones. Avec un noyau « normal » 32 bits (par opposition au noyau « hugemem »), un peu moins de 1 Go de mémoire est alloué à la zone normale et le reste à la mémoire haute :
Zone DMA premiers 16 Mo de mémoire Zone Normale 16 Mo à ~1 Go Zone Highmem ~1 Go à la fin
La plupart des opérations du noyau sont effectuées en zone normale, il s'agit donc de la zone la plus critique du système : le noyau y conserve entre autres les tables de pages des processus (correspondance entre adresses virtuelles applicatives et adresses physiques), ainsi que les tables d'inodes des systèmes de fichiers. La mémoire haute, elle, sert principalement aux caches/buffers des systèmes de fichiers et aux allocations des applications.
Lorsque le remplissage de la zone normale atteint un certain seuil, le thread noyau
kswapd est réveillé et commence à libérer de la mémoire de façon asynchrone. Si
la pression mémoire devient trop forte, la libération se fait de manière synchrone, et si le
noyau ne parvient toujours pas à récupérer assez de mémoire, il finit par arrêter des
processus : c'est l'OOM killer (Out Of Memory).
⚠️ L'OOM killer peut intervenir même s'il reste du swap disponible et même s'il reste de la mémoire haute libre, uniquement parce que la pression sur la zone normale est trop forte — c'est un piège classique de diagnostic sur les architectures 32 bits.
Pistes pour limiter ce risque :
- Passer à un système 64 bits sur le matériel qui le supporte — l'architecture 64 bits utilise
un adressage différent qui ne scinde pas la mémoire entre zone normale et zone haute.
- Augmenter
lower_zone_protection(ou son équivalent moderne
vm.lowmem_reserve_ratio, cf.sysctl) pour forcer le noyau à libérer la mémoire plus tôt et retarder le risque de manque.
- Sur RHEL4, utiliser un noyau « hugemem » qui permet d'étendre la zone normale jusqu'à 4 Go
(si la mémoire physique disponible le permet).
Ces contraintes de zones mémoire sont spécifiques aux noyaux 32 bits ; elles ne s'appliquent pas aux systèmes 64 bits actuels.
Scheduler d'entrées/sorties (I/O scheduler)
Le scheduler d'E/S détermine l'ordre et le regroupement des requêtes disque. Sur les anciens
systèmes (GRUB legacy), il se fixe au boot via un paramètre noyau dans
/boot/grub/grub.conf, en fin de ligne kernel :
kernel /vmlinuz-2.6.32-300.10.1.el5uek ro root=/dev/vg_root/lv_root rhgb quiet elevator=deadline
Le scheduler actif (et les autres disponibles) se consulte et se change à chaud par nœud de périphérique bloc, sans reboot :
cat /sys/block/xvdb/queue/scheduler
# [noop] anticipatory deadline cfq
echo deadline > /sys/block/xvdb/queue/scheduler # changement à chaud
Sur les noyaux plus récents (multiqueue / blk-mq), les schedulers historiques
(noop, anticipatory, cfq) ont été remplacés par
none, mq-deadline, kyber et bfq — la commande
cat /sys/block/<disque>/queue/scheduler reste la même pour consulter la
liste réellement disponible sur un système donné (à vérifier au cas par cas selon le noyau).
Complément : http://www.gnutoolbox.com/linux-io-elevator/
TRIM et SSD
Sur SSD, l'option de montage discard (TRIM) permet au système de fichiers
d'indiquer au contrôleur quels blocs ne sont plus utilisés, ce qui maximise les performances
et la durée de vie du disque dans la durée. Systèmes de fichiers supportés : Btrfs, Ext4,
XFS, JFS.
Vérifier que le disque supporte TRIM :
hdparm -I /dev/sda | grep TRIM
Activer l'option au montage, dans /etc/fstab :
/dev/sda1 / ext4 defaults,noatime,discard 0 1
/dev/sda2 /home ext4 defaults,noatime,discard 0 2
⚠️ Le TRIM synchrone (discard à chaque suppression) peut dégrader les
performances sur certains contrôleurs/firmwares plus anciens ; une alternative plus sûre est
un TRIM périodique via un timer fstrim.timer (systemd) plutôt que l'option
discard en continu (à vérifier selon le matériel et la distribution).