Ingo Molnar, znany programista jądra Linux i autor planisty zadań CFS (Completely Fair Scheduler), zaproponował do dyskusji na liście mailingowej programistów jądra Linux serię patchy, które dotyczą ponad połowy wszystkich plików w źródłowych tekstach jądra, zapewniając zwiększenie prędkości pełnej rekonfiguracji jądra o 50-80% w zależności od ustawień. Zrealizowana optymalizacja wyróżnia się tym, że związana jest z dodaniem największego w historii rozwoju jądra zestawu zmian — zaproponowano do akceptacji 2297 patchy, zmieniających ponad 25 tysięcy plików (10 tysięcy plików nagłówkowych w katalogach „include/” i „arch/*/include/” oraz 15 tysięcy plików źródłowych).
Wzrost wydajności osiągany jest poprzez zmianę metody przetwarzania plików nagłówkowych. Zauważono, że przez trzydzieści lat rozwoju jądra stan plików nagłówkowych przyjął niepokojący wygląd z powodu dużej liczby wzajemnych zależności między plikami. Prace nad restrukturyzacją plików nagłówkowych trwały ponad rok i wymagały znacznej przebudowy hierarchii i zależności. Podczas restrukturyzacji dokonano podziału definicji typów i API dla różnych subsystemów jądra.
Wśród wprowadzonych zmian: oddzielenie wysokopoziomowych plików nagłówkowych od siebie, wykluczenie łączących plików nagłówkowych funkcji inline, wydzielenie plików nagłówkowych dla typów i API, zapewnienie oddzielnej kompilacji plików nagłówkowych (około 80 plików miało przeszkadzające w kompilacji pośrednie zależności, ustalone przez inne pliki nagłówkowe), automatyczne dodawanie zależności do plików „.h” i „.c”, krokowa optymalizacja plików nagłówkowych, użycie trybu „CONFIG_KALLSYMS_FAST=y”, selektywna konsolidacja plików C w bloki kompilacyjne w celu zmniejszenia liczby plików obiektowych.
W efekcie przeprowadzone prace umożliwiły zmniejszenie rozmiaru nagłówków przetwarzanych na etapie postpreprocesowania o 1-2 rzędy wielkości. Na przykład przed optymalizacją użycie nagłówka „linux/gfp.h” skutkowało dodaniem 13543 linii kodu i włączeniem 303 zależnych nagłówków, a po optymalizacji rozmiar zmniejszył się do 181 linii i 26 zależnych plików. Inny przykład: podczas preprocesowania pliku „kernel/pid.c” bez łatki włączanych jest 94 tysiące linii kodu, z czego większość nie jest używana w pid.c. Podział plików nagłówkowych pozwolił na zmniejszenie objętości przetwarzanego kodu trzykrotnie, redukując liczbę przetwarzanych linii do 36 tysięcy.
Podczas pełnej przebudowy jądra poleceniem „make -j96 vmlinux” na systemie testowym zastosowanie łatek 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ę) oraz poprawiło wydajność wykorzystania rdzeni CPU podczas budowy. Przy inkrementalnej budowie efekt optymalizacji jest jeszcze bardziej zauważalny — czas ponownej kompilacji jądra po wprowadzeniu zmian w plikach nagłówkowych skrócił się wielokrotnie (od 112% do 173% w zależności od modyfikowanego pliku nagłówkowego). Optymalizacje są na razie dostępne tylko dla architektur ARM64, MIPS, Sparc oraz x86 (32- i 64-bit).
Źródło: opennet.ru
