Ingo Molnar, un rinomato sviluppatore Linux Il kernel e l'autore dello scheduler di attività CFS (Completely Fair Scheduler) lo hanno proposto per la discussione sulla mailing list degli sviluppatori del kernel. Linux Una serie di patch che interessano più della metà di tutti i file del codice sorgente del kernel e che forniscono un aumento del 50-80% nella velocità di ricompilazione completa del kernel, a seconda delle impostazioni. Questa ottimizzazione è degna di nota perché include il più grande insieme di modifiche nella storia dello sviluppo del kernel: 2297 patch proposte per l'inclusione simultanea, che modificano più di 25 file (10 file di intestazione nelle directory "include/" e "arch/*/include/" e 15 file di codice sorgente).
I miglioramenti delle prestazioni si ottengono modificando il metodo di elaborazione dei file di intestazione. È stato osservato che, in oltre trent'anni di sviluppo del kernel, lo stato dei file di intestazione è diventato deprimente a causa della presenza di un gran numero di dipendenze incrociate tra i file. Il lavoro di ristrutturazione dei file di intestazione ha richiesto più di un anno e una significativa rielaborazione della gerarchia e delle dipendenze. Durante la ristrutturazione, si è lavorato per separare le definizioni di tipo e le API per i diversi sottosistemi del kernel.
Tra le modifiche apportate: separazione dei file di intestazione di alto livello l'uno dall'altro, esclusione delle funzioni inline che collegano i file di intestazione, allocazione dei file di intestazione per tipi e API, fornitura di un assemblaggio separato dei file di intestazione (circa 80 file avevano dipendenze indirette che interferivano con l'assemblaggio, esposte tramite altri file di intestazione), aggiunta automatica delle dipendenze ai file ".h" e ".c", ottimizzazione passo dopo passo dei file di intestazione, utilizzo della modalità "CONFIG_KALLSYMS_FAST=y", consolidamento selettivo dei file C in blocchi di assemblaggio per ridurre il numero di file oggetto.
Di conseguenza, il lavoro svolto ci ha permesso di ridurre di 1-2 ordini di grandezza le dimensioni dei file di intestazione elaborati in fase di post-pre-elaborazione. Ad esempio, prima dell'ottimizzazione, l'utilizzo del file di intestazione "linux/gfp.h" comportava l'aggiunta di 13543 righe di codice e la connessione di 303 file di intestazione dipendenti; dopo l'ottimizzazione, le dimensioni si sono ridotte a 181 righe e 26 file dipendenti. Un altro esempio: durante la pre-elaborazione del file "kernel/pid.c" senza una patch, sono state connesse 94 righe di codice, la maggior parte delle quali non viene utilizzata in pid.c. Separando i file di intestazione abbiamo potuto ridurre di tre volte la quantità di codice elaborato, riducendo il numero di righe elaborate a 36.
Ricostruendo completamente il kernel con il comando "make -j96 vmlinux" sul sistema di test, l'applicazione delle patch ha mostrato una riduzione del tempo di compilazione del ramo v5.16-rc7 da 231.34 a 129.97 secondi (da 15.5 a 27.7 build all'ora), aumentando anche l'efficienza nell'utilizzo dei core della CPU durante la compilazione. Con l'assemblaggio incrementale, l'effetto dell'ottimizzazione è ancora più evidente: il tempo di ricostruzione del kernel dopo aver apportato modifiche ai file di intestazione è diminuito notevolmente (dal 112% al 173% a seconda del file di intestazione modificato). Le ottimizzazioni sono attualmente disponibili solo per le architetture ARM64, MIPS, Sparc e x86 (a 32 e 64 bit).
Fonte: opennet.ru
