Im Linux-Kernel wird die Möglichkeit zur Nutzung von eBPF für die Erstellung von Task-Schedulern eingeführt.

Linus Torvalds hat seine Bereitschaft erklärt, die Patches für den Mechanismus „sched_ext“ (SCX), die eBPF zur Erstellung von CPU-Schedulern nutzen, die nahezu alle Aspekte der Aufgabenausführung und der Ressourcenzuweisung von CPU abdecken, in den Linux-Kernel 6.11 aufzunehmen, dessen Release Ende September erwartet wird. Solche Scheduler können dynamisch geladen und innerhalb des Linux-Kernels in einer eBPF-VM ausgeführt werden, in der der Bytecode dank JIT-Kompilierung in Maschinenbefehle übersetzt und mit der Leistung von kompiliertem Code ausgeführt wird.

Die vorgeschlagenen Patches implementieren eine neue Klasse der Planung SCHED_EXT, für die die Kernpriorität zwischen den Klassen SCHED_IDLE und SCHED_NORMAL festgelegt ist. Dadurch kann in BPF-Handlern, die an SCHED_EXT gebunden sind, nicht auf Aufgaben Einfluss genommen werden, die bereits dem Standard-Scheduler (SCHED_NORMAL) zugewiesen sind. Es ermöglicht jedoch das Anheften einzelner Aufgaben an SCHED_EXT oder das Verschieben aller Prozesse, deren Priorität unter der für die Echtzeitausführung liegt, zur Verarbeitung mittels SCHED_EXT. Falls keine BPF-Handler an SCHED_EXT gebunden sind, werden alle Prozesse, die in die Klasse SCHED_EXT verschoben werden, durch den SCHED_NORMAL-Scheduler verarbeitet. Die Arbeit der BPF-Handler besteht darin, die Warteschlangen der Aufgaben zu analysieren, die auf die Ausführung auf der CPU warten (eine globale Warteschlange und eine Warteschlange pro CPU-Kern), und eine Aufgabe auszuwählen, der die CPU-Ressourcen bei der Freigabe des nächsten CPU-Kerns zugewiesen werden sollen.

Der Mechanismus sched_ext vereinfacht die Erstellung spezifischer Scheduler für bestimmte Aufgaben, ermöglicht es, mit verschiedenen Techniken und Strategien der Planung zu experimentieren und prototypische Lösungen schnell zu erstellen sowie Scheduler zur Laufzeit in produktiven Infrastrukturen auszutauschen. So kann beispielsweise mit sched_ext ein Scheduler erstellt werden, der die Besonderheiten einer bestimmten Anwendung berücksichtigt und die Planung seiner Ausführung dynamisch ändertes, abhängig vom Systemzustand und anderen Faktoren.

Derzeit werden bereits etwa ein Dutzend Scheduler auf Basis von sched_ext entwickelt, deren Logik der Aufgabenplanung im Benutzerraum definiert wird und in Form von BPF-Programmen in den Kernel geladen wird:

  • scx_layered — ein hybrider Aufgaben-Scheduler, der Aufgaben in Schichten aufteilt, für die jeweils eine eigene Planungstrategie angewendet wird. Beispielsweise ermöglicht scx_layered das Herausstellen bestimmter Aufgaben in eine separate Schicht, für die bestimmte garantierte CPU-Ressourcen bereitgestellt werden, oder die Priorität einzelner Anwendungen zu erhöhen. Der Scheduler wird von der Firma Meta entwickelt. Die im Benutzerraum arbeitende Logik für die Generierung von BPF ist in Rust geschrieben.
  • scx_rustland — ein Scheduler, der optimiert ist, um die Priorität interaktiver Aufgaben im Vergleich zu CPU-intensiven Aufgaben zu erhöhen. Beispielsweise ermöglichte der scx_rustland-Scheduler während des Starts der Spielanwendung Terraria gleichzeitig mit dem Kernelbuilding eine höhere FPS im Spiel als bei Verwendung des Standard-Schedulers EEVDF. Das Projekt wird von einem Mitarbeiter der Firma Canonical entwickelt. Die im Benutzerraum arbeitende Logik für die Generierung von BPF ist in Rust geschrieben.
  • scx_lavd — die Implementierung des Aufgabenscheduling-Algorithmus LAVD (Latency-criticality Aware Virtual Deadline), der die Aktualität der Verringerung von Latenzen für bestimmte Aufgaben berücksichtigt und Informationen über den Fortschritt der Prozesse nutzt, um Entscheidungen über die Zuweisung von CPU-Ressourcen zu treffen. Der Scheduler wird von den Unternehmen Igalia und Valve entwickelt, um Latenzen in Computerspielen und interaktiven Aufgaben zu verringern. Die im Benutzerraum arbeitende Logik für die Generierung von BPF ist in Rust geschrieben.
  • scx_rusty, scx_rlfifo, scx_mitosis — Beispiele für Scheduler mit Komponenten im Benutzerraum, die in Rust geschrieben sind und die Balance zwischen Gruppen von Aufgaben je nach Last implementieren, den einfachsten FIFO-Scheduler sowie einen Scheduler zur Bindung von Gruppen von Aufgaben an CPU-Kerne.
  • scx_central, scx_flatcg, scx_nest, scx_pair, scx_qmap, scx_simple, scx_userland — Beispiele für Scheduler 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 Überprüfung vorgeschlagen, woraufhin sechs Patchversionen veröffentlicht wurden. Trotz der fehlenden Unterstützung im Hauptkern können die Distributionen Ubuntu, Arch Linux, Fedora und NixOS sched_ext über zusätzliche Pakete installieren. Canonical prüft die Möglichkeit, die Komponenten von sched-ext in Ubuntu 24.10 aufzunehmen, während Valve an der Integration von sched_ext in Steam Deck arbeitet. Bei Meta wird der scheduler basierend auf sched_ext bereits in der Betriebsinfrastruktur verwendet.

Google experimentiert mit dem eigenen Framework ghOSt, das es ermöglicht, Entscheidungen des Task-Schedulers mithilfe von BPF-Programmen zu beeinflussen. Derzeit wird an der Portierung von ghOSt auf sched_ext gearbeitet. Google entwickelt außerdem einen Port von sched_ext für ChromeOS mit der Absicht, ihn zur Nutzung des hybriden Schedulers scx_layered einzusetzen, um Latenzen ohne die Verwendung von Erweiterungen für Echtzeitbetrieb zu reduzieren. Oculus arbeitet an einem Port von sched_ext für Android.

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster