Linus Torvalds hat seine Bereitschaft erklĂ€rt, in den Linux-Kernel 6.11, dessen Veröffentlichung fĂŒr Ende September erwartet wird, Patches mit der Implementierung des Mechanismus âsched_extâ (SCX) aufzunehmen. Dieser ermöglicht die Verwendung von eBPF zur Erstellung von CPU-Schedulern, die nahezu alle Aspekte der TaskausfĂŒhrung und Ressourcenverteilung der CPU abdecken. Solche Scheduler können dynamisch geladen und im Linux-Kernel in einer eBPF-virtuellen Maschine ausgefĂŒhrt werden, in der durch JIT-Kompilierung der Bytecode in Maschinenanweisungen ĂŒbersetzt und mit der Leistung von kompiliertem Code ausgefĂŒhrt wird.
Die vorgeschlagenen Patches implementieren eine neue Scheduling-Klasse SCHED_EXT, fĂŒr die eine PrioritĂ€t des Kernelaufrufs zwischen den Klassen SCHED_IDLE und SCHED_NORMAL festgelegt wird. Dies verhindert, dass BPF-Handler, die an SCHED_EXT gebunden sind, die bereits an den Standard-Task-Scheduler (SCHED_NORMAL) angehĂ€ngten Aufgaben beeinflussen, ermöglicht jedoch das Anheften von einzelnen Aufgaben an SCHED_EXT oder das Verschieben aller Prozesse zur Verarbeitung, die eine niedrigere PrioritĂ€t als die EchtzeitausfĂŒhrung haben. Wenn an SCHED_EXT keine BPF-Handler gebunden sind, werden alle Prozesse, die in die Klasse SCHED_EXT verschoben werden, mit dem Scheduler SCHED_NORMAL verarbeitet. Die Arbeit der BPF-Handler besteht darin, die Warteschlangen von Aufgaben zu analysieren, die auf die AusfĂŒhrung auf der CPU warten (eine globale Warteschlange und eine Warteschlange pro CPU-Kern), und die Aufgabe auszuwĂ€hlen, die bei der Freigabe des nĂ€chsten CPU-Kerns Ressourcen erhalten soll.
Der Mechanismus sched_ext vereinfacht die Erstellung von fĂŒr bestimmte Aufgaben spezifischen Schedulern, ermöglicht das Experimentieren mit verschiedenen Techniken und Strategien der Planung und erlaubt ein schnelles Erstellen von Prototypen sowie das sofortige Ersetzen von Schedulern in Produktionsinfrastrukturen. Beispielsweise kann mit sched_ext ein Scheduler entwickelt werden, der die Besonderheiten einer bestimmten Anwendung berĂŒcksichtigt und die Planungstrategie dynamisch Ă€ndert, basierend auf dem Zustand des Systems und anderen Einflussfaktoren.
Derzeit entwickeln sich bereits etwa ein Dutzend Planer auf Basis von sched_ext, deren Logik zur Aufgabenplanung im Benutzerraum definiert und in Form von BPF-Programmen in den Kernel geladen wird:
- scx_layered ist ein hybrider Aufgabenplaner, der Aufgaben in Schichten unterteilt, fĂŒr die jeweils eine eigene Planungsstrategie angewendet wird. Beispielsweise ermöglicht es scx_layered, bestimmte Aufgaben in eine separate Schicht zu verschieben, fĂŒr die garantierte CPU-Ressourcen bereitgestellt werden, oder den PrioritĂ€tsstatus einzelner Anwendungen zu erhöhen. Der Planer wird von Meta entwickelt. Die im Benutzerraum laufende BPF-Generierungslogik ist in Rust geschrieben.
- scx_rustland ist ein Planer, der optimiert ist, um die PrioritÀt interaktiver Aufgaben im Vergleich zu CPU-intensiven Aufgaben zu erhöhen. Zum Beispiel ermöglichte der Planer scx_rustland in einem Test, bei dem die Spielanwendung Terraria gleichzeitig mit dem Kernbau gestartet wurde, ein höheres FPS im Spiel als bei der Verwendung des Standardplaners EEVDF. Das Projekt wird von einem Mitarbeiter der Firma Canonical entwickelt. Die im Benutzerraum laufende BPF-Generierungslogik ist in Rust geschrieben.
- scx_lavd ist die Implementierung des Aufgabenscheduling-Algorithmus LAVD (Latency-criticality Aware Virtual Deadline), der die Relevanz der Reduzierung von Latenzen fĂŒr spezifische Aufgaben berĂŒcksichtigt und Informationen ĂŒber den Fortschritt der Prozesse verwendet, um Entscheidungen ĂŒber die Zuweisung von CPU-Ressourcen zu treffen. Der Planer wird von den Unternehmen Igalia und Valve entwickelt, um Latenzen in Computerspielen und interaktiven Aufgaben zu reduzieren. Die im Benutzerraum laufende BPF-Generierungslogik ist in Rust geschrieben.
- scx_rusty, scx_rlfifo, scx_mitosis sind Beispiele fĂŒr Planer mit Komponenten im Benutzerraum in Rust, die eine Balance zwischen Gruppen von Aufgaben je nach Last schaffen, einen einfachsten FIFO-Planer implementieren und einen Planer zur Zuordnung von Gruppen von Aufgaben zu CPU-Kernen darstellen.
- scx_central, scx_flatcg, scx_nest, scx_pair, scx_qmap, scx_simple, scx_userland sind Beispiele fĂŒr Planer mit Komponenten im Benutzerraum in C, die verschiedene Möglichkeiten von sched-ext veranschaulichen.
UrsprĂŒnglich wurde der Mechanismus sched_ext 2022 von den Entwicklern des Kernels zur PrĂŒfung vorgeschlagen, wonach sechs Patchversionen veröffentlicht wurden. Obwohl der Mechanismus im Hauptkernel keine UnterstĂŒtzung findet, haben Benutzer von Ubuntu, Arch Linux, Fedora und NixOS die Möglichkeit, sched_ext ĂŒber zusĂ€tzliche Pakete zu installieren. Canonical zieht in Betracht, die Komponenten von sched-ext in die Ubuntu-Version 24.10 aufzunehmen, wĂ€hrend Valve an der Integration von sched_ext in das Steam Deck arbeitet. Bei Meta wird der auf sched_ext basierende Scheduler bereits in der Arbeitsinfrastruktur eingesetzt.
Google experimentiert mit der Anwendung des eigenen Frameworks ghOSt, das es ermöglicht, durch BPF-Programme Einfluss auf die Entscheidungen des Task-Schedulers zu nehmen. Derzeit wird an der Portierung von ghOSt auf sched_ext gearbeitet. Google entwickelt auch einen Port von sched_ext fĂŒr ChromeOS mit der Absicht, diesen zu verwenden, um den hybriden Scheduler scx_layered zu aktivieren und Verzögerungen ohne die Verwendung von Erweiterungen fĂŒr Echtzeitarbeiten zu reduzieren. Oculus entwickelt einen Port von sched_ext fĂŒr Android.
Quelle: opennet.ru
