Powrót do strony głównej

sched_ext: BPF-planiści w Linux 6.12

sched_ext w Linux 6.12 wprowadza dynamiczne polityki BPF planowania zadań, oddzielając logikę od jądra. Opisane haki enqueue/dispatch, przykłady scx_horoscope/lavd/rusty, benchmarki i scenariusze zastosowań.

Polityki BPF sched_ext w Linux: od eksperymentów do produkcji
Advertisement 728x90

# sched_ext w jądrze Linux 6.12: dynamiczne planery na BPF

W wydaniu jądra Linux 6.12 pojawiła się klasa planerów sched_ext, umożliwiająca dynamiczną wymianę logiki alokacji zadań za pomocą programów BPF. Dzięki temu nie trzeba stosować patchy ani ponownie kompilować jądra przy eksperymentach z algorytmami. Polityki są ładowane z przestrzeni użytkownika, a jądro zapewnia bezpieczeństwo mechanizmem powrotu do SCHED_NORMAL w razie awarii.

Klasa sched_ext dzieli odpowiedzialność: jądro zarządza kolejkami dyspozytorskimi (DSQ), migracją zadań i ich stanem, natomiast polityka BPF decyduje o klasyfikacji, randze i kwancie czasu. Po wybudzeniu zadania wywoływany jest hak enqueue(), przy zwolnieniu przez jądro — dispatch().

Cykl życia zadania w sched_ext

Zadanie jest wybudzane za pomocą try_to_wake_up(), polityka analizuje jego cechy: wzorce wybudzania, wykorzystanie CPU/IO, cgroup, obecność polityk RT (SCHED_FIFO, SCHED_RR). Polityka umieszcza zadanie w kolejce globalnej lub lokalnej, korzystając z wirtualnego czasu do ustalania priorytetów.

Google AdInline article slot

W dispatch() pobierane jest zadanie i przekazywane do jądra za pomocą scx_bpf_dispatch() z kwantem w nanosekundach. Migrację inicjuje scx_bpf_kick_cpu() w celu zrównoważenia obciążenia lub poprawy lokalności pamięci podręcznej.

Kolejki DSQ działają w trybie FIFO lub z priorytetami w zależności od metody wstawiania:

  • scx_bpf_dispatch() — semantyka FIFO.
  • scx_bpf_dispatch_vtime() — porządkowanie według vtime.

Wewnętrzna ranga (score) polityki nie wpływa na priorytety jądra (nice, prio).

Google AdInline article slot

Przykład: scx_horoscope jako demonstracja możliwości

Projekt scx_horoscope wykorzystuje dane astrologiczne do korygowania kwantów, ilustrując wzorzec sched_ext. Co 60 sekund obliczane są pozycje planet, retrogradacja i fazy Księżyca, generując współczynniki.

Klasyfikacja zadań według:

  • Polityk RT.
  • Wzorców wybudzania.
  • Wykorzystania CPU/IO.
  • cgroup.

Podstawowy kwant jest korygowany mnożnikami: znaki zodiaku podnoszą/obniżają dla typów zadań, retrogradacja — kara 50%, pełnia Księżyca — bonus dla interaktywnych. Kwant jest ograniczany przez min_slice_ns i max_slice_ns.

Google AdInline article slot

To przykład edukacyjny: rzeczywiste obliczenia, stabilna praca, ale bez naukowego uzasadnienia do produkcji.

Praktyczne planery na sched_ext

Ekosystem scx obejmuje polityki zorientowane na produkcję:

  • scx_lavd (Latency-Aware Virtual Deadline): wirtualne terminy na podstawie wzorców wybudzania, redukcja 99. percentyla opóźnień o 15–30% w porównaniu do CFS na desktopach.
  • scx_rusty: optymalizacja NUMA, minimalizacja migracji, uwzględnienie limitów termicznych dla serwerów.
  • scx_flash: predykcje ML z przestrzeni użytkownika przez współdzieloną pamięć.

Czas cyklu rozwoju skrócił się do godzin: kompilacja, załadowanie, metryki, iteracja bez restartu.

Narzędzia do benchmarkingu

Ocena za pomocą:

  • /sys/kernel/sched_ext/ — metryki dispatch, migracji.
  • bpftrace — śledzenie zdarzeń.
  • perf sched — opóźnienia przełączania kontekstu.
  • cyclictest — ogonowe opóźnienia.

Uwaga na percentyle, nie średnie: ogony są kluczowe dla responsywności.

Scenariusze zastosowań:

  • Serwery gier: gwarantowany kwant dla logiki, izolacja od tła.
  • Wbudowane: grupowanie zadań w celu zmniejszenia częstotliwości przełączeń.
  • Chmura: gwarancje przepustowości poza cgroup.
  • Audio/wideo: rezerwacja rdzeni, minimalizacja jittera.

Ograniczenia i rozwój

Narzut od wywołań dispatch rośnie przy wysokiej częstotliwości przełączeń. Błędy logiczne degradują wydajność bez paniki. API ewoluuje, status eksperymentalny.

Co ważne:

  • sched_ext w 6.12 z CONFIG_SCHED_CLASS_EXT.
  • Polityki BPF do szybkiego prototypowania.
  • Powrót do SCHED_NORMAL przy awariach.
  • Uwaga na percentyle w benchmarkach.
  • Zastosowania w scenariuszach krytycznych dla opóźnień i NUMA.

— Editorial Team

Advertisement 728x90

Czytaj dalej