Ингo Молнар (Ingo Molnar), известен разработчик на ядрото на Linux и автор на планировчика на задачи CFS (Completely Fair Scheduler), предложи за обсъждане в пощенския списък на разработчиците на ядрото на Linux серия от пачове, които засягат над половината от всички файлове в изходния код на ядрото и осигуряват увеличение на скоростта на пълната преработка на ядрото с 50-80% в зависимост от настройките. Реализираната оптимизация се отличава с това, че е свързана с добавянето на най-голямото в историята на разработката на ядрото множество промени — предлагани за включване веднъж 2297 пача, които променят над 25 хиляди файла (10 хиляди заглавни файла в каталозите „include/” и „arch/*/include/” и 15 хиляди файла с изходен код).
Увеличението на производителността се постига чрез промяна на метода за обработка на заглавните файлове. Отбелязва се, че през тридесетте години на разработката на ядрото състоянието на заглавните файлове е придобило тъжен вид поради наличието на голям брой взаимни зависимости между файловете. Работата по преструктурирането на заглавните файлове отне повече от година и изискваше значително преработване на иерархиите и зависимостите. По време на преструктурирането беше извършена работа по разделянето на определенията на типове и API за различните подсистеми на ядрото.
Сред внесените промени са: отделяне на висококачествени заглавни файлове едни от други, изключване на свързващи заглавни файлове на inline функции, разпределение на заглавни файлове за типове и API, осигуряване на отделна обработка на заглавни файлове (около 80 файла имаха пречки за компилиране чрез непреки зависимости, зададени от други заглавни файлове), автоматично добавяне на зависимости към файлове „.h” и „.c”, стъпкова оптимизация на заглавни файлове, използване на режим „CONFIG_KALLSYMS_FAST=y”, селективна консолидиране на Си файлове в сборни блокове за намаляване на броя на обектните файлове.
В крайна сметка, извършената работа позволи да се намали размерът на заглавните файлове, обработвани на етапа на постпроцесинг, с 1-2 порядъка. Например, преди оптимизацията използването на заглавния файл „linux/gfp.h” довеждаше до добавяне на 13543 реда код и включване на 303 зависими заглавни файла, а след оптимизация размерът намаля до 181 реда и 26 зависими файла. Или друг пример: при постпроцесинг на файла „kernel/pid.c” без пача се включват 94 хиляди реда код, голяма част от който не се използва в pid.c. Разделянето на заглавните файлове позволи да се намали обемът на обработвания код три пъти, намалявайки броя на обработваните редове до 36 хиляди.
При пълно преизграждане на ядрото с командата «make -j96 vmlinux» на тестовата система, прилагането на пачове показа съкращаване на времето за компилиране на клон v5.16-rc7 от 231.34 на 129.97 секунди (от 15.5 на 27.7 компилации на час), както и повиши ефективността на използването на ядра на CPU по време на компилация. При инкрементална компилация ефектът от оптимизацията е още по-забележим — времето за повторно преизграждане на ядрото след промени в заглавните файлове се е съкратила многократно (от 112% до 173% в зависимост от променяния заглавен файл). Оптимизациите за момента са достъпни само за архитектурите ARM64, MIPS, Sparc и x86 (32- и 64-битови).
Източник: opennet.ru
