sched_ext im Linux-Kernel 6.12: Dynamische Scheduler mit BPF
Die Veröffentlichung des Linux-Kernels 6.12 führt die sched_ext-Schedulerklasse ein, die den dynamischen Austausch der Task-Scheduling-Logik über BPF-Programme ermöglicht. Dadurch entfällt die Notwendigkeit für Patches und Kernel-Neubuilds beim Experimentieren mit Algorithmen. Policies werden aus dem User Space geladen, wobei der Kernel durch einen Fallback-Mechanismus zu SCHED_NORMAL bei Fehlern für Sicherheit sorgt.
Die sched_ext-Klasse teilt die Verantwortlichkeiten auf: Der Kernel übernimmt Dispatch-Queues (DSQ), Task-Migration und Zustandsverwaltung, während die BPF-Policy für Klassifizierung, Rang und Time Slice zuständig ist. Beim Wakeup eines Tasks wird der enqueue()-Hook aufgerufen; beim Kernel-Dispatch erfolgt der Aufruf von dispatch().
Lebenszyklus von Tasks in sched_ext
Ein Task erwacht über try_to_wake_up(), und die Policy analysiert seine Merkmale: Wakeup-Muster, CPU/IO-Nutzung, cgroup und Vorhandensein von RT-Policies (SCHED_FIFO, SCHED_RR). Die Policy platziert den Task in eine globale oder lokale Queue und nutzt virtuelle Zeit für die Priorisierung.
In dispatch() wird der Task aus der Queue entnommen und zusammen mit einem Time Slice in Nanosekunden über scx_bpf_dispatch() an den Kernel übergeben. Migration wird durch scx_bpf_kick_cpu() für Load Balancing oder Cache-Lokalität ausgelöst.
DSQ-Queues arbeiten im FIFO- oder Prioritätsmodus je nach Einfügemethode:
- scx_bpf_dispatch() — FIFO-Semantik.
- scx_bpf_dispatch_vtime() — Sortierung nach vtime.
Der interne Rang (Score) der Policy beeinflusst keine Kernel-Prioritäten (nice, prio).
Beispiel: scx_horoscope als Demonstration der Möglichkeiten
Das scx_horoscope-Projekt nutzt astrologische Daten, um Time Slices anzupassen, und zeigt das sched_ext-Muster. Alle 60 Sekunden berechnet es Planetenpositionen, Retrograden und Mondphasen, um Koeffizienten zu erzeugen.
Task-Klassifizierung nach:
- RT-Policies.
- Wakeup-Mustern.
- CPU/IO-Nutzung.
- cgroup.
Der Basis-Time-Slice wird durch Multiplikatoren angepasst: Tierkreiszeichen verstärken oder mindern Slices für Task-Typen, Retrograden verursachen eine 50%ige Strafe, und Vollmonde geben Boni für interaktive Tasks. Slices sind durch min_slice_ns und max_slice_ns begrenzt.
Dies ist ein lehrreiches Beispiel: Reale Berechnungen mit stabilem Betrieb, aber ohne wissenschaftliche Grundlage für den produktiven Einsatz.
Praktische Scheduler auf sched_ext
Das scx-Ökosystem umfasst produktionsreife Policies:
- scx_lavd (Latency-Aware Virtual Deadline): Virtuelle Deadlines basierend auf Wakeup-Mustern, reduziert 99. Perzentil-Latenzen um 15–30 % im Vergleich zu CFS auf Desktops.
- scx_rusty: NUMA-Optimierung, minimierte Migrationen und Berücksichtigung thermischer Grenzen für Server.
- scx_flash: ML-Vorhersagen aus dem User Space über Shared Memory.
Entwicklungszyklen haben sich auf Stunden verkürzt: Bauen, Laden, Metriken, Iterieren – keine Reboots nötig.
Tools für Benchmarks
Bewertung über:
/sys/kernel/sched_ext/— Dispatch- und Migrationsmetriken.- bpftrace — Event-Tracing.
- perf sched — Context-Switch-Latenzen.
- cyclictest — Tail-Latenzen.
Fokus auf Perzentile, nicht Durchschnitte: Schwänze sind entscheidend für Reaktionsfähigkeit.
Anwendungsfälle:
- Game-Server: Garantierte Slices für Game-Logik, Isolation von Hintergrundtasks.
- Embedded-Systeme: Task-Gruppierung zur Reduzierung der Switch-Häufigkeit.
- Cloud: Bandbreitengarantien jenseits von cgroup.
- Audio/Video: Core-Reservierung, Minimierung von Jitter.
Einschränkungen und Entwicklung
Overhead von Dispatch-Aufrufen steigt bei hohen Switch-Raten. Logische Fehler verschlechtern die Performance, ohne Panics auszulösen. Die API entwickelt sich weiter, und das Feature bleibt experimentell.
Wichtige Punkte:
- sched_ext in 6.12 mit CONFIG_SCHED_CLASS_EXT.
- BPF-Policies für schnelles Prototyping.
- Fallback zu SCHED_NORMAL bei Fehlern.
- Fokus auf Perzentile in Benchmarks.
- Anwendungen in latenzkritischen und NUMA-Szenarien.
— Editorial Team
Noch keine Kommentare.