Linus Torvalds wyraził gotowość przyjęcia do jądra Linuksa 6.11, którego wydanie planowane jest na koniec września, poprawek wprowadzających mechanizm «sched_ext» (SCX), umożliwiający wykorzystanie eBPF do tworzenia planów CPU obejmujących praktycznie wszystkie aspekty planowania wykonywania zadań oraz przydzielania zasobów CPU. Takie planery mogą być ładowane dynamicznie i wykonywane w jądrze Linuksa w wirtualnej maszynie eBPF, w której, dzięki zastosowaniu kompilacji JIT, bajtkod jest tłumaczony na instrukcje maszynowe i wykonywany z wydajnością skompilowanego kodu.
Proponowane poprawki wprowadzają nową klasę planowania SCHED_EXT, dla której ustalany jest priorytet wywołań przez jądro między klasami SCHED_IDLE i SCHED_NORMAL, co nie pozwala w obsługiwaczach BPF związanych z SCHED_EXT wpłynąć na zadania już przypisane do standardowego planera zadań (SCHED_NORMAL), ale umożliwia przypisanie pojedynczych zadań do SCHED_EXT lub przeniesienie do jego przetwarzania wszystkich procesów o priorytecie niższym niż wykonywanie w czasie rzeczywistym. Jeśli do SCHED_EXT nie są przypisane obsługiwacze BPF, wszystkie procesy przeniesione do klasy SCHED_EXT będą przetwarzane za pomocą planera SCHED_NORMAL. Działalność obsługiwaczy BPF ogranicza się do analizy kolejek zadań oczekujących na wykonanie na CPU (jedna globalna kolejka i jedna kolejka na rdzeń CPU) oraz wyboru zadania, któremu należy przydzielić zasoby CPU przy zwolnieniu kolejnego rdzenia CPU.
Mechanizm sched_ext ułatwia tworzenie specyficznych dla określonych zadań planów, umożliwia eksperymentowanie z różnymi technikami i strategiami planowania oraz pozwala szybko tworzyć działające prototypy i zmieniać plany w locie w istniejących infrastrukturach. Na przykład, za pomocą sched_ext można stworzyć plan, który bierze pod uwagę specyfikę określonej aplikacji i dynamicznie zmienia strategię planowania jej wykonania w zależności od stanu systemu i dodatkowych czynników.
Obecnie rozwija się już około dziesięciu schedulerów opartych na sched_ext, w których logika planowania zadań jest określana w przestrzeni użytkownika i ładowana do jądra w formie programów BPF:
- scx_layered — hybrydowy scheduler zadań, który dzieli zadania na warstwy, dla każdej z których stosowana jest własna strategia planowania. Na przykład, scx_layered pozwala na wydzielenie w oddzielną warstwę niektórych zadań, dla których będą przydzielone określone gwarantowane zasoby CPU lub na podniesienie priorytetu niektórych aplikacji. Scheduler rozwija firma Meta. Logika generowania BPF działająca w przestrzeni użytkownika napisana jest w języku Rust.
- scx_rustland — scheduler zoptymalizowany do podnoszenia priorytetu interaktywnych zadań w obliczu zadań intensywnie obciążających CPU. Na przykład, w teście uruchomienia gry Terraria równocześnie z kompilacją jądra, scheduler scx_rustland pozwolił osiągnąć w grze wyższe FPS niż przy użyciu standardowego planera EEVDF. Projekt rozwija pracownik firmy Canonical. Logika generowania BPF działająca w przestrzeni użytkownika napisana jest w języku Rust.
- scx_lavd — realizacja algorytmu planowania zadań LAVD (Latency-criticality Aware Virtual Deadline), uwzględniającego ważność redukcji opóźnień dla konkretnych zadań i wykorzystującego informacje o przebiegu wykonywania procesów przy podejmowaniu decyzji o alokacji zasobów CPU. Scheduler rozwijają firmy Igalia i Valve w celu zredukowania opóźnień w grach komputerowych oraz interaktywnych zadaniach. Logika generowania BPF działająca w przestrzeni użytkownika napisana jest w języku Rust.
- scx_rusty, scx_rlfifo, scx_mitosis — przykłady schedulerów z komponentami w przestrzeni użytkownika napisanymi w języku Rust, realizujące równoważenie pomiędzy grupami zadań w zależności od obciążenia, najprostszy FIFO scheduler oraz scheduler do przypisania grup zadań do rdzeni CPU.
- scx_central, scx_flatcg, scx_nest, scx_pair, scx_qmap, scx_simple, scx_userland — przykłady schedulerów z komponentami w przestrzeni użytkownika napisanymi w języku C, ilustrujące różne możliwości sched-ext.
Początkowo mechanizm sched_ext został zaproponowany do rozważenia przez programistów jądra w 2022 roku, po czym opublikowano sześć edycji łaty. Pomimo braku wsparcia w głównym składzie jądra, dla dystrybucji Ubuntu, Arch Linux, Fedora i NixOS udostępniono możliwość zainstalowania sched_ext przez dodatkowe pakiety. Firma Canonical rozważa możliwość włączenia komponentów sched-ext do Ubuntu 24.10, a firma Valve pracuje nad integracją sched_ext w Steam Deck. W firmie Meta planista oparty na sched_ext jest już stosowany w infrastrukturze roboczej.
Firma Google eksperymentuje z użyciem własnego frameworka ghOSt, który pozwala wpływać na decyzje planisty zadań za pomocą programów BPF. Obecnie rozpoczęto prace nad portowaniem ghOSt na sched_ext. Google rozwija również port sched_ext dla ChromeOS z zamiarem wykorzystania go do uruchomienia hybrydowego planisty scx_layered, aby zredukować opóźnienia bez używania rozszerzeń do pracy w czasie rzeczywistym. Firma Oculus rozwija port sched_ext dla Androida.
Źródło: opennet.ru
