Noyau RT

Optimiser son serveur Debian 9 avec un noyau temps réel (1000 Hz, Real Time, CPU Performance)

Généralités
Installation des dépendances
Téléchargement du code source du noyau
Application du patch RT (Real Time)
Configuration du noyau
Construction du noyau
Installation du noyau modifié

Le noyau Linux (ou kernel en anglais) est un noyau de système d'exploitation de type UNIX. Le noyau Linux est un logiciel libre développé essentiellement en langage C.

Le noyau est le cœur du système, c'est lui qui s'occupe de fournir aux logiciels une interface pour utiliser le matériel, c'est lui qui amorce le système d'exploitation. Il est possible d'avoir plusieurs noyaux et utiliser celui de votre choix.

Pourquoi compiler son noyau ? Les noyaux fournis par défaut dans votre distribution GNU/Linux sont des noyaux capables de tourner sur un maximum de machines et de matériels. Ils sont donc souvent plus lourds, mais la différence de rapidité est en général assez faible. En fait les vraies raisons de compiler son propre noyau sont les suivantes :

  • Comprendre comment fonctionne le noyau Linux.
  • Faire fonctionner un matériel ou une fonctionnalité qui n'est pas pris en charge par votre noyau actuel.
  • Appliquer un correctif.
  • Installation des dépendances

Commencez par installer toutes les dépendances pour recompiler le noyau.

apt install build-essential libncurses5-dev fakeroot xz-utils

Il est conseillé d'utiliser les sources de votre distribution. En effet, la plupart des distributions modifient ces sources pour y ajouter des fonctionnalités ou des correctifs de sécurité.

Nous allons installer les sources du noyau fourni par la distribution Debian.

apt install linux-source

Notez que le paquet installe une archive compressée des sources du noyau linux-source-4.9.tar.xz et une archive compressée du patch RT linux-patch-4.9-rt.patch.xz (qui a pour effet de donner au noyau Linux un comportement temps réel ou real time en anglais) dans le dossier /usr/src/.

Pour visualiser les archives des sources du noyau.

ls /usr/src

Veuillez noter que les numéros de version spécifiques du noyau varieront, ici il s'agissait de la version 4.9. Selon la version actuelle du noyau que vous construisez, vous devrez ajuster vos commandes en conséquence.

Nous allons extraire ces fichiers, par exemple dans un nouveau dossier de notre dossier personnel /root/kernel.

mkdir -p ~/kernel/
cd ~/kernel/
tar -xaf /usr/src/linux-source-4.9.tar.xz

Pour appliquer le patch Linux-rt au noyau, il faut se déplacer dans le dossier contenant les sources du noyau, puis nous installons le patch.

cd linux-source-4.9/
xzcat /usr/src/linux-patch-4.9-rt.patch.xz | patch -p1

Lors de la recompilation du noyau (éventuellement d'une version plus récente), la configuration sera très probablement conservée au plus près de celle proposée par Debian. Dans ce cas, et plutôt que de tout reconfigurer de zéro, il suffit de copier le fichier /boot/config-<version> (la version est celle du noyau actuellement utilisé, que l'on retrouve avec la commande uname -r) dans un fichier nommé .config dans le dossier contenant les sources du noyau.

cp /boot/config-$(uname -r) ~/kernel/linux-source-4.9/.config

Pour lancer l'utilitaire de configuration du noyau, il faut taper la commande make menuconfig.

make menuconfig

La navigation dans cette interface est simple :

  • Flèches haut/bas pour monter/descendre
  • Entrée pour entrer dans les sous-menus
  • Échap deux fois pour sortir d'un sous-menu
  • h pour demander l'aide d'une option
  • / pour rechercher une option
  • Espace pour sélectionner une option

Ici vous définissez les paramètres du noyau comme ceci :

Preemption Model : On sélectionnera l’option la plus préemptible. En particulier si le patch Linux-rt est appliqué, on choisira « Fully Preemptible Kernel » pour obtenir la meilleure réactivité face aux interruptions.

 -> Processor type and features  --->
    -> Preemption Model ( ... )  --->
        (X) Fully Preemptible Kernel (Real-Time)

Timer Frequency : C’est la fréquence du tick système qui influe sur la granularité des timers logiciels de basse fréquence. 1000 Hz est le choix préféré pour les systèmes nécessitant des réponses interactives rapides aux événements.

 -> Processor type and features  --->
    -> Timer frequency ( ... )  --->
        (X) 1000 HZ

High Resolution Timer Support : Si l’architecture permet de disposer de timers haute résolution (fréquence supérieure à 1kHz) il est toujours intéressant de les utiliser. Cette option est indépendante de la précédente.

 -> General setup  --->
    -> Timers subsystem  --->
        [*] High Resolution Timer Support

Tickless system : Cette option permet au processeur de s’endormir « profondément » lorsqu’il est inactif. Sur un système temps-réel, au contraire on la désactivera, car l’endormissement du processeur rallonge le temps de réaction aux interruptions.

 -> General setup  --->
    -> Timers subsystem  --->
      -> Timer tick handling ( ... )  --->
        (X) Full dynticks system (tickless)

CPU frequency scaling : La mise à l'échelle de la fréquence du cpu aide à économiser de l'énergie en ralentissant le cpu lorsque la charge est faible et en l'accélérant à nouveau lorsque la charge augmente. Cela peut avoir un impact sur les performances du système, car l'augmentation de la fréquence du cpu en réponse à une charge système plus élevée ne se produit pas instantanément.

 -> Power management and ACPI options  --->
    -> CPU Frequency scaling  --->
      [*] CPU Frequency scaling
      -> Default CPUFreq governor ( ... )  --->
        (X) performance

Une fois la configuration du noyau prête, enregistrez (Save) et quittez (Exit) menuconfig.

Nous allons maintenant construire le noyau, ce qui prendra un certain temps (20-40 minutes sur un processeur moderne).

make clean
make -j `nproc` deb-pkg LOCALVERSION=-custom KDEB_PKGVERSION=$(make kernelversion)-1

Explications basiques :

make clean : Nettoye le code source.
make deb-pkg : Compile en créant des paquets debian (.deb).
-j `nproc` : Facultatif. Prend le nombre de threads total de votre processeur (la compilation sera la plus rapide possible).
LOCALVERSION= : Facultatif. Donne le nom custom au noyau. Vous pouvez utiliser votre propre nom.
KDEB_PKGVERSION= : Facultatif. Cet argument sert à versionner le kernel (soit version 1).

Une fois la construction terminée, vérifiez les paquets Debian.

ls ../*.deb

Make deb-pkg générera jusqu'à 5 paquets Debian :

linux-headers-<version>.deb : Qui contient les fichiers d'en-tête nécessaires à la compilation modules externes.
linux-image-<version>.deb : Qui contient l'image du noyau et les modules associés.
linux-image-<version>-dbg.deb : Qui contient les symboles de débogage pour l'image du noyau et ses modules.
linux-libc-dev_<version>.deb : Qui contient des en-têtes pertinents pour certaines bibliothèques de l'espace utilisateur comme GNU glibc.
linux-firmware-image-<version>.deb : Qui contient les fichiers de firmware nécessaires à certains pilotes (ce paquet peut être manquant lorsque vous compilez à partir des sources du noyau fournies par Debian).

Ensuite, il faut installer tous les paquets Debian du noyau.

dpkg -i ../*.deb

Maintenant que le nouveau noyau est installé, redémarrez le système. Une fois que votre système a redémarré, votre nouveau noyau devrait être en cours d'exécution. 

reboot

Pour vérifier la nouvelle version patché du noyau.

uname -a

Le noyau de votre distribution Debian est maintenent temps réel (PREEMPT RT)

Voici la différence avec l'ancienne version du noyau.