Ingo Molnar, développeur célèbre du noyau Linux et auteur du planificateur de tâches CFS (Completely Fair Scheduler), a proposé pour discussion sur la liste de diffusion des développeurs du noyau Linux une série de patchs touchant plus de la moitié de tous les fichiers dans le code source du noyau et permettant d'augmenter la vitesse de reconstruction complète du noyau de 50 à 80 % selon les configurations. L'optimisation mise en œuvre est remarquable en ce qu'elle s'accompagne de l'ajout du plus grand ensemble de changements dans l'histoire du développement du noyau — un total de 2297 patchs, modifiant plus de 25 000 fichiers (10 000 fichiers d'en-tête dans les répertoires « include/ » et « arch/*/include/ » et 15 000 fichiers de code source).
L'augmentation des performances est obtenue grâce à un changement de méthode de traitement des fichiers d'en-tête. Il est noté qu'après trente ans de développement du noyau, l'état des fichiers d'en-tête a pris un aspect préoccupant en raison du grand nombre de dépendances croisées entre les fichiers. Le travail de restructuration des fichiers d'en-tête a duré plus d'un an et a nécessité une révision significative de la hiérarchie et des dépendances. Au cours de la restructuration, un travail a été réalisé pour séparer les définitions de types et l'API pour différents sous-systèmes du noyau.
Parmi les changements apportés : séparation des fichiers d'en-tête de haut niveau les uns des autres, exclusion des fichiers d'en-tête liant des fonctions inline, création de fichiers d'en-tête pour les types et l'API, garantie d'une compilation isolée des fichiers d'en-tête (environ 80 fichiers avaient des dépendances indirectes gênantes définies par d'autres fichiers d'en-tête), ajout automatique des dépendances aux fichiers « .h » et « .c », optimisation progressive des fichiers d'en-tête, utilisation du mode « CONFIG_KALLSYMS_FAST=y », consolidation sélective des fichiers C en blocs de compilation pour réduire le nombre de fichiers objets.
Finalement, le travail effectué a permis de réduire la taille des fichiers d'en-tête traités au stade du post-prétraitement de 1 à 2 ordres de grandeur. Par exemple, avant optimisation, l'utilisation du fichier d'en-tête «linux/gfp.h» entraînait l'ajout de 13 543 lignes de code et la connexion de 303 fichiers d'en-tête dépendants, alors qu'après optimisation, la taille a été réduite à 181 lignes et 26 fichiers dépendants. Un autre exemple : lors du prétraitement du fichier «kernel/pid.c», sans patch, 94 000 lignes de code étaient connectées, dont la majeure partie n'était pas utilisée dans pid.c. La séparation des fichiers d'en-tête a permis de réduire le volume de code traité par trois, diminuant le nombre de lignes à 36 000.
Lors de la reconstruction complète du noyau avec la commande «make -j96 vmlinux» sur le système de test, l'application des patchs a montré une réduction du temps de compilation de la branche v5.16-rc7, passant de 231,34 à 129,97 secondes (de 15,5 à 27,7 compilations par heure), tout en améliorant l'efficacité d'utilisation des cœurs CPU pendant la compilation. Lors de la compilation incrémentielle, l'effet de l'optimisation est encore plus remarquable : le temps de recompilation du noyau après modifications dans les fichiers d'en-tête a été réduit de manière significative (de 112 % à 173 % selon le fichier d'en-tête modifié). Les optimisations sont pour l'instant disponibles uniquement pour les architectures ARM64, MIPS, Sparc et x86 (32 et 64 bits).
Source : opennet.ru
