Ingo Molnar, un cunoscut dezvoltator al nucleului Linux și autor al planificatorului de sarcini CFS (Completely Fair Scheduler), a propus spre discuție pe lista de corespondență a dezvoltatorilor nucleului Linux o serie de patch-uri care afectează mai mult de jumătate din toate fișierele din codul sursă al nucleului, asigurând o creștere a vitezei de recompilare completă a nucleului cu 50-80%, în funcție de setări. Optimizarea realizată este notabilă prin faptul că este însoțită de adăugarea celui mai mare set de modificări din istoria dezvoltării nucleului - fiind propuse 2297 patch-uri, care modifică mai mult de 25 de mii de fișiere (10 mii de fișiere header în directorul „include/” și „arch/*/include/” și 15 mii de fișiere cu cod sursă).
Creșterea performanței este realizată prin schimbarea metodei de procesare a fișierelor header. Se observă că, în cei treizeci de ani de dezvoltare a nucleului, starea fișierelor header a devenit dezolantă din cauza unui număr mare de dependențe încrucișate între fișiere. Lucrările de restructurare a fișierelor header au durat mai bine de un an și au necesitat o revizuire semnificativă a ierarhiei și a dependențelor. În timpul restructurării, au fost realizate lucrări de separare a definițiilor de tipuri și API-uri pentru diferitele subsisteme ale nucleului.
Printre modificările aduse: separarea fișierelor header de nivel înalt unii de alții, excluzând fișierele de legătură pentru funcțiile inline, separarea fișierelor header pentru tipuri și API-uri, asigurarea compilării distincte a fișierelor header (aproximativ 80 de fișiere aveau dependențe indirecte care împiedicau compilarea, fiind setate prin alte fișiere header), adăugarea automată a dependențelor pentru fișierele „.h” și „.c”, optimizarea pe etape a fișierelor header, utilizarea modului „CONFIG_KALLSYMS_FAST=y”, consolidarea selectivă a fișierelor C în blocuri de compilare pentru a reduce numărul de fișiere obiect.
Ca urmare, munca efectuată a permis reducerea dimensiunii fişierelor header cu 1-2 ordine de mărime, procesate în etapele post-preprocesare. De exemplu, înainte de optimizare, utilizarea fișierului header „linux/gfp.h” ducea la adăugarea a 13543 linii de cod și conectarea a 303 fișiere header dependente, iar după optimizare dimensiunea s-a redus la 181 de linii și 26 de fișiere dependente. Sau, un alt exemplu: la preprocesarea fișierului „kernel/pid.c” fără patch, sunt conectate 94 de mii de linii de cod, cea mai mare parte a căror nu este folosită în pid.c. Separarea fișierelor header a permis reducerea volumului de cod procesat de trei ori, ajungându-se la 36 de mii de linii de cod procesate.
La recompilarea completă a nucleului cu comanda „make -j96 vmlinux” pe sistemul de test, aplicarea patch-urilor a arătat o reducere a timpului de compilare a ramurii v5.16-rc7 de la 231,34 la 129,97 secunde (de la 15,5 la 27,7 compilări pe oră), precum și o creștere a eficienței utilizării nucleelor CPU în timpul compilării. La compilarea incrementală, efectul optimizării este și mai vizibil — timpul necesar recompilării nucleului după modificarea fișierelor header s-a redus semnificativ (de la 112% la 173%, în funcție de fișierul header modificat). Optimizările sunt deocamdată disponibile doar pentru arhitecturile ARM64, MIPS, Sparc și x86 (32 și 64 de biți).
Sursa: opennet.ro
