Инг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
