Ingo Molnar, a Linux kernel ismert fejlesztője és a CFS (Completely Fair Scheduler) feladatütemező szerzője, egy sor patch-et javasolt a Linux kernel fejlesztői levelezőlistáján, amely a kernel forráskódjának több mint felét érinti, és a kernel teljes újrafordításának sebességét 50-80%-kal növeli a beállításoktól függően. Az implementált optimalizáció figyelemre méltó, mivel a kernel fejlesztésének történetében a legnagyobb változtatási csomag hozzáadásával jár — összesen 2297 patch kerül egy lépésben integrálásra, amelyek több mint 25 ezer fájlt módosítanak (10 ezer fejléces fájl az «include/» és «arch/*/include/» könyvtárakban, valamint 15 ezer forrásfájl).
A teljesítménynövekedés a fejléces fájlok feldolgozási módszerének megváltoztatásával érhető el. Megjegyzik, hogy a kernel fejlesztése során harminc év alatt a fejléces fájlok állapota számos keresztfüggőség miatt aggasztóvá vált. A fejlécek átalakításán végzett munka több mint egy évet vett igénybe, és jelentős átdolgozást igényelt a hierarchiák és a függőségek terén. Az átalakítás során a típusok és API-k definiálásainak szétválasztásán is dolgoztak a kernel különböző alrendszerei számára.
Az elvégzett változtatások között szerepel: a magas szintű fejlécek egymástól való szétválasztása, a linkelő fejlécek inline-függvényeinek kizárása, a típusok és API-k fejléceinek kiemelése, valamint a fejlécek önálló fordításának biztosítása (körülbelül 80 fájl rendelkezett zavaró közvetett függőségekkel, amelyek más fejléceken keresztül voltak elérhetők), a «.h» és «.c» fájlokhoz való függőségek automatikus hozzáadása, a fejlécek lépésről lépésre történő optimalizálása, a «CONFIG_KALLSYMS_FAST=y» mód használata, a C-fájlok szelektív konszolidálása a fordítási blokkokba az objektív fájlok számának csökkentése érdekében.
A végzett munka lehetővé tette a fejléc fájlok méretének 1-2 renddel való csökkentését a poszt-preprocesszálási szakaszban. Például az optimalizálás előtt a «linux/gfp.h» fejléc fájl használata 13543 kódsor és 303 függő fejléc fájl beillesztését eredményezte, míg az optimalizálás után a méret 181 sorra és 26 függő fájlra csökkent. Egy másik példa: a «kernel/pid.c» fájl preprocesszálása javítás nélkül 94 ezer sor kódot tartalmazott, amelynek nagy része nem volt használva a pid.c-ben. A fejléc fájlok szétválasztása lehetővé tette, hogy a feldolgozott kód mennyisége háromszorosára csökkenjen, és a feldolgozott sorok száma 36 ezerre csökkenjen.
A mag teljes újrabuildelése a «make -j96 vmlinux» paranccsal a teszt rendszeren a javítások alkalmazása során 231,34 másodpercről 129,97 másodpercre csökkentette a v5.16-rc7 ág buildelési idejét (15,5-ről 27,7 build/hóra), és növelte a CPU magok hatékony felhasználását a buildelés közben. Inkrementális buildelés során az optimalizálás hatása még nyilvánvalóbb — a mag újrakezdési ideje a fejléc fájlok módosítása után drámaian csökkent (112%-tól 173%-ig a módosított fejléc fájltól függően). Az optimalizálások jelenleg csak az ARM64, MIPS, Sparc és x86 (32- és 64-bites) architektúrák számára érhetők el.
Forrás: opennet.ru
