Ingo Molnar, znany deweloper Linux kernel i autor harmonogramu zadań CFS (Completely Fair Scheduler) zaproponowali go do dyskusji na liście mailingowej programistów kernela Linux Seria poprawek, która wpływa na ponad połowę wszystkich plików w kodzie źródłowym jądra i zapewnia wzrost szybkości pełnych przebudów jądra o 50-80%, w zależności od ustawień. Ta optymalizacja jest godna uwagi, ponieważ obejmuje największy zestaw zmian w historii rozwoju jądra – 2297 poprawek zaproponowanych do uwzględnienia jednocześnie, zmieniających ponad 25 000 plików (10 000 plików nagłówkowych w katalogach „include/” i „arch/*/include/” oraz 15 000 plików kodu źródłowego).
Wzrost wydajności osiąga się poprzez zmianę metody przetwarzania plików nagłówkowych. Należy zauważyć, że w ciągu trzydziestu lat rozwoju jądra stan plików nagłówkowych przybrał przygnębiający wygląd ze względu na obecność dużej liczby współzależności między plikami. Restrukturyzacja pliku nagłówkowego trwała ponad rok i wymagała znacznej przeróbki hierarchii i zależności. Podczas restrukturyzacji wykonano prace nad oddzieleniem definicji typów i interfejsów API dla różnych podsystemów jądra.
Wśród wprowadzonych zmian: oddzielenie od siebie plików nagłówkowych wysokiego poziomu, wyeliminowanie funkcji inline łączących pliki nagłówkowe, oddzielenie plików nagłówkowych dla typów i API, zapewnienie oddzielnego montażu plików nagłówkowych (około 80 plików miało pośrednie zależności zakłócające montaż, ujawnione poprzez inne pliki nagłówkowe), automatyczne dodawanie zależności do plików „.h” i „.c”, krok po kroku optymalizacja plików nagłówkowych, wykorzystanie trybu „CONFIG_KALLSYMS_FAST=y”, selektywna konsolidacja plików C w bloki asemblerowe zmniejszyć liczbę plików obiektowych.
W rezultacie wykonane prace pozwoliły zmniejszyć rozmiar plików nagłówkowych przetwarzanych na etapie post-preprocessingu o 1-2 rzędy wielkości. Na przykład przed optymalizacją użycie pliku nagłówkowego „linux/gfp.h” skutkowało dodaniem 13543 linii kodu i włączeniem 303 zależnych plików nagłówkowych, a po optymalizacji rozmiar został zmniejszony do 181 linii i 26 plików zależnych. Albo inny przykład: podczas wstępnego przetwarzania pliku „kernel/pid.c” bez łatki uwzględniane są 94 tysiące linii kodu, z których większość nie jest używana w pid.c. Oddzielenie plików nagłówkowych pozwoliło trzykrotnie zmniejszyć ilość przetwarzanego kodu, redukując liczbę przetworzonych linii do 36 tys.
Kiedy jądro zostało całkowicie przebudowane za pomocą polecenia „make -j96 vmlinux” w systemie testowym, zastosowanie poprawek wykazało skrócenie czasu kompilacji gałęzi v5.16-rc7 z 231.34 do 129.97 sekundy (z 15.5 do 27.7 kompilacji na godzinę), a także zwiększyło efektywność wykorzystania rdzeni procesora podczas montażu. Przy kompilacji przyrostowej efekt optymalizacji jest jeszcze bardziej zauważalny - czas przebudowy jądra po dokonaniu zmian w plikach nagłówkowych znacznie się skrócił (ze 112% do 173% w zależności od zmienianego pliku nagłówkowego). Optymalizacje są obecnie dostępne tylko dla architektur ARM64, MIPS, Sparc i x86 (32- i 64-bitowe).
Źródło: opennet.ru
