W jądrze Linuksa pojawi się możliwość wykorzystania eBPF do tworzenia planerów zadań

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

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster