Pubblicata una serie di patch che velocizzano la compilazione del kernel Linux del 50-80%

Ingo Molnar, un noto sviluppatore del kernel Linux e autore del task scheduler CFS (Completely Fair Scheduler), ha proposto di discutere sulla mailing list degli sviluppatori del kernel Linux una serie di patch che interessano più della metà di tutti i file nei sorgenti del kernel e fornire un aumento della velocità di ricostruzione completa del kernel del 50-80% a seconda delle impostazioni. L'ottimizzazione implementata è degna di nota in quanto è associata all'aggiunta del più grande insieme di modifiche nella storia dello sviluppo del kernel: sono state proposte per l'inclusione 2297 patch contemporaneamente, modificando più di 25mila file (10mila file di intestazione nella sezione "include" /” e le directory “arch/*/include/” e 15mila file con testi sorgenti).

Il miglioramento delle prestazioni si ottiene modificando il metodo di elaborazione dei file di intestazione. È da notare che in trent'anni di sviluppo del kernel, lo stato dei file header ha assunto un aspetto deprimente a causa della presenza di un gran numero di dipendenze incrociate tra i file. La ristrutturazione del file di intestazione ha richiesto più di un anno e ha richiesto una rielaborazione significativa della gerarchia e delle dipendenze. Durante la ristrutturazione, si è lavorato per separare le definizioni dei tipi e le API per i diversi sottosistemi del kernel.

Tra le modifiche apportate: separare i file header di alto livello gli uni dagli altri, eliminare le funzioni inline che collegano i file header, separare i file header per tipi e API, garantire un assemblaggio separato dei file header (circa 80 file avevano dipendenze indirette che interferivano con l'assemblaggio, esposte tramite altri file header), aggiunta automatica di dipendenze ai file ".h" e ".c", ottimizzazione passo passo dei file header, 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 ha permesso di ridurre di 1-2 ordini di grandezza la dimensione dei file di intestazione elaborati nella fase di post-preelaborazione. Ad esempio, prima dell'ottimizzazione, l'utilizzo del file di intestazione "linux/gfp.h" comportava l'aggiunta di 13543 righe di codice e l'inclusione di 303 file di intestazione dipendenti, mentre dopo l'ottimizzazione la dimensione è stata ridotta a 181 righe e 26 file dipendenti. Oppure un altro esempio: quando si preelabora il file “kernel/pid.c” senza patch, vengono incluse 94mila righe di codice, la maggior parte delle quali non viene utilizzata in pid.c. La separazione dei file di intestazione ha permesso di ridurre di tre volte la quantità di codice elaborato, riducendo il numero di righe elaborate a 36mila.

Quando il kernel è stato completamente ricostruito con il comando “make -j96 vmlinux” su un sistema di test, l'applicazione delle patch ha mostrato una riduzione del tempo di build del ramo v5.16-rc7 da 231.34 a 129.97 secondi (da 15.5 a 27.7 build all'ora) e ha anche aumentato l'efficienza dell'utilizzo dei core della CPU durante gli assemblaggi. Con una build incrementale, l'effetto dell'ottimizzazione è ancora più evidente: il tempo necessario per ricostruire il kernel dopo aver apportato modifiche ai file header è diminuito significativamente (dal 112% al 173% a seconda del file header modificato). Le ottimizzazioni sono attualmente disponibili solo per le architetture ARM64, MIPS, Sparc e x86 (32 e 64 bit).

Fonte: opennet.ru

Aggiungi un commento