Im Linux-Kernel wird die Möglichkeit eingeführt, eBPF zur Erstellung von Task-Scheduler zu verwenden.

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

60GB SSD 8Gb DDR4