Ingo Molnar, ein bekannter Entwickler des Linux-Kernels und Autor des Completely Fair Scheduler (CFS), hat in der Mailingliste der Kernel-Entwickler eine Reihe von Patches zur Diskussion gestellt, die mehr als die Hälfte aller Dateien im Quellcode des Kernels betreffen und eine Geschwindigkeitssteigerung der vollständigen Kernel-Neukompilierung um 50-80% je nach Konfiguration bieten. Die durchgeführte Optimierung ist bemerkenswert, da sie mit der Aufnahme des größten Änderungssets in der Geschichte der Kernel-Entwicklung verbunden ist – insgesamt werden 2297 Patches vorgeschlagen, die mehr als 25.000 Dateien ändern (10.000 Header-Dateien in den Verzeichnissen 'include/' und 'arch/*/include/' sowie 15.000 Quellcodedateien).
Die Leistungssteigerung wird durch die Änderung der Methode zur Verarbeitung von Header-Dateien erreicht. Es ist zu beobachten, dass die Header-Dateien in den dreißig Jahren der Kernentwicklung aufgrund zahlreicher wechselseitiger Abhängigkeiten zwischen den Dateien in einen bedauerlichen Zustand geraten sind. Die Arbeit an der Restrukturierung der Header-Dateien dauerte über ein Jahr und erforderte eine umfassende Überarbeitung der Hierarchie und Abhängigkeiten. Im Verlauf der Restrukturierung wurde eine Arbeit zur Trennung von Typdefinitionen und APIs für verschiedene Subsysteme des Kerns durchgeführt.
Unter den vorgenommenen Änderungen sind: die Trennung von hochrangigen Header-Dateien, das Ausklammern von Link-Header-Dateien für Inline-Funktionen, die klare Zuordnung von Header-Dateien für Typen und APIs, die Gewährleistung einer separaten Kompilierung von Header-Dateien (ungefähr 80 Dateien hatten störende indirekte Abhängigkeiten von anderen Header-Dateien), die automatische Hinzufügung von Abhängigkeiten zu den Dateien " .h" und " .c", die schrittweise Optimierung von Header-Dateien, die Nutzung des Modus "CONFIG_KALLSYMS_FAST=y", sowie die selektive Konsolidierung von C-Dateien in Kompilierungsblöcke zur Reduzierung der Anzahl an Objektdateien.
Insgesamt ermöglichte die durchgeführte Arbeit, die Größe der Header-Dateien, die in der Phase der Vorverarbeitung verarbeitet werden, um ein bis zwei Größenordnungen zu reduzieren. Zum Beispiel führte vor der Optimierung die Verwendung der Header-Datei „linux/gfp.h“ zu einer Addition von 13.543 Codezeilen und der Einbindung von 303 abhängigen Header-Dateien. Nach der Optimierung reduzierte sich die Größe auf 181 Zeilen und 26 abhängige Dateien. Ein weiteres Beispiel: Beim Preprocessing der Datei „kernel/pid.c“ ohne Patch werden 94.000 Codezeilen eingebunden, von denen die meisten in pid.c nicht verwendet werden. Die Aufteilung der Header-Dateien reduzierte das Volumen des verarbeiteten Codes um das Dreifache und senkte die Anzahl der verarbeiteten Zeilen auf 36.000.
Bei einer vollständigen Neuübersetzung des Kernels mit dem Befehl „make -j96 vmlinux“ auf dem Testsystem zeigte sich, dass der Einsatz von Patches die Bauzeit des Zweigs v5.16-rc7 von 231,34 auf 129,97 Sekunden verkürzte (von 15,5 auf 27,7 Builds pro Stunde) und die Nutzung der CPU-Kerne während des Builds optimierte. Bei einer inkrementellen Erstellung ist der Effekt der Optimierung noch deutlicher — die Zeit für die erneute Übersetzung des Kernels nach Änderungen an den Header-Dateien reduzierte sich um ein Vielfaches (von 112 % bis 173 %, je nach geändertem Header). Diese Optimierungen sind bisher nur für die Architekturen ARM64, MIPS, Sparc und x86 (32- und 64-Bit) verfügbar.
Quelle: opennet.ru
