Ingo Molnar, známy vývojár Linux jadra a autor plánovača úloh CFS (Completely Fair Scheduler), navrhol na diskusiu v mailing liste vývojárov jadra Linux sériu patchov, ktoré sa dotýkajú viac ako polovice všetkých súborov v zdrojových textoch jadra a zaisťujú zvýšenie rýchlosti úplného prekompilovania jadra o 50-80% v závislosti od nastavení. Realizovaná optimalizácia je pozoruhodná tým, že je spojená s pridávaním najväčšieho súboru zmien v histórii vývoja jadra — na zahrnutie naraz je navrhnutých 2297 patchov, ktoré menia viac ako 25 tisíc súborov (10 tisíc hlavičkových súborov v adresároch „include/“ a „arch/*/include/“ a 15 tisíc súborov so zdrojovými textami).
Zvýšenie výkonu sa dosahuje zmenou metódy spracovania hlavičkových súborov. Je pozorované, že za tridsať rokov vývoja jadra sa stav hlavičkových súborov stal deprimujúcim v dôsledku veľkého počtu krížových závislostí medzi súbormi. Práca na reštrukturalizácii hlavičkových súborov trvala viac ako rok a vyžadovala si značnú prerábku hierarchie a závislostí. Počas reštrukturalizácie bola vykonaná práca na oddelení definícií typov a API pre rôzne subsystémy jadra.
Medzi vykonanými zmenami: oddelenie vysokoúrovňových hlavičkových súborov od seba, vylúčenie spájajúcich hlavičkových súborov inline-funkcií, vyčlenenie hlavičkových súborov pre typy a API, zaisťovanie oddelenej kompilácie hlavičkových súborov (asi 80 súborov malo prekážajúce závislosti v kompilácii, vyžadované cez iné hlavičkové súbory), automatické pridávanie závislostí pre súbory „.h“ a „.c“, postupná optimalizácia hlavičkových súborov, využívanie režimu „CONFIG_KALLSYMS_FAST=y“, selektívna konsolidácia C-súborov do kompilovaných blokov na zníženie počtu objektových súborov.
Výsledkom vykonanej práce sa podarilo zmenšiť veľkosť hlavičkových súborov spracovávaných počas fázy post-preprocessingu o 1-2 rády. Napríklad pred optimalizáciou použitie hlavičkového súboru „linux/gfp.h“ viedlo k pridaniu 13543 riadkov kódu a pripojeniu 303 závislých hlavičkových súborov, zatiaľ čo po optimalizácii sa veľkosť znížila na 181 riadkov a 26 závislých súborov. Alebo iný príklad: pri preprocesovaní súboru „kernel/pid.c“ bez patche sa pripojuje 94 tisíc riadkov kódu, z ktorých väčšina sa v pid.c nepoužíva. Rozdelenie hlavičkových súborov umožnilo znížiť objem spracovávaného kódu trikrát, znížením počtu spracovávaných riadkov na 36 tisíc.
Pri úplnej recompilácii jadra príkazom „make -j96 vmlinux“ na testovacom systéme aplikácia patchov ukázala skrátenie času kompilácie vetvy v5.16-rc7 z 231,34 na 129,97 sekúnd (z 15,5 na 27,7 kompilácií za hodinu), a taktiež zvýšila efektivitu využitia CPU počas kompilácie. Pri inkrementálnej kompilácii je efekt optimalizácie ešte výraznejší — doba opätovnej recompilácie jadra po vykonaní zmien v hlavičkových súboroch sa výrazne skrátila (od 112% do 173% v závislosti od meneného hlavičkového súboru). Optimalizácie sú zatiaľ dostupné len pre architektúry ARM64, MIPS, Sparc a x86 (32- a 64-bit).
Zdroj: opennet.ru
