Opublikowano zestaw poprawek przyspieszających budowę jądra Linuksa o 50-80%

Ingo Molnar, znany programista jądra Linuksa i autor harmonogramu zadań CFS (Completely Fair Scheduler), zaproponował do dyskusji na liście mailingowej deweloperów jądra Linuksa serię poprawek, które wpływają na ponad połowę wszystkich plików w źródłach jądra i zapewniają wzrost szybkości całkowitej przebudowy jądra o 50-80% w zależności od ustawień. Wdrożona optymalizacja jest godna uwagi, ponieważ wiąże się z dodaniem największego zestawu zmian w historii rozwoju jądra - do włączenia na raz zaproponowano 2297 łatek, zmieniających ponad 25 tysięcy plików (10 tysięcy plików nagłówkowych w „include /” i „arch/*/include/” oraz 15 tys. plików z tekstami źródłowymi).

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

Dodaj komentarz