Linus Torvalds ha espresso la sua disponibilità ad accettare nel kernel Linux 6.11, il cui rilascio è previsto per la fine di settembre, patch che implementano il meccanismo "sched_ext" (SCX), permettendo di utilizzare eBPF per creare scheduler CPU che coprono praticamente tutti gli aspetti della pianificazione delle esecuzioni e della distribuzione delle risorse CPU. Tali scheduler possono essere caricati dinamicamente e eseguiti all'interno del kernel Linux in una macchina virtuale eBPF, nella quale, grazie all'uso della compilazione JIT, il bytecode viene tradotto in istruzioni macchina ed eseguito con le prestazioni di un codice compilato.
Le patch proposte implementano una nuova classe di scheduling SCHED_EXT, per la quale è stabilita una priorità di invocazione dal kernel tra le classi SCHED_IDLE e SCHED_NORMAL. Questo impedisce ai BPF handler associati a SCHED_EXT di influenzare i task già collegati allo scheduler standard (SCHED_NORMAL), ma consente l'associazione di task singoli a SCHED_EXT o lo spostamento di tutti i processi con priorità inferiore all'esecuzione in tempo reale per essere gestiti mediante esso. Se non sono legati BPF handler a SCHED_EXT, tutti i processi spostati nella classe SCHED_EXT saranno gestiti dallo scheduler SCHED_NORMAL. Il lavoro degli handler BPF si concentra sull'analisi delle code di attesa dei task per l'esecuzione sulla CPU (una coda globale e una coda per ogni core CPU) e sulla selezione del task a cui fornire risorse CPU quando un core CPU diventa disponibile.
Il meccanismo sched_ext semplifica la creazione di scheduler specifici per determinate task, consente di sperimentare con varie tecniche e strategie di scheduling, e permette di creare rapidamente prototipi funzionanti e sostituire gli scheduler al volo nelle infrastrutture operative. Ad esempio, con sched_ext è possibile realizzare uno scheduler che tenga conto della specificità di una determinata applicazione e cambi dinamicamente la strategia di programmazione in base allo stato del sistema e ad altri fattori.
Attualmente, sono in sviluppo circa una decina di scheduler basati su sched_ext, la logica di scheduling dei quali è definita nello spazio utente e caricata nel kernel come programmi BPF:
- scx_layered — un scheduler ibrido che suddivide i task in strati, per ciascuno dei quali si applica una specifica strategia di programmazione. Ad esempio, scx_layered consente di isolare in uno strato particolare alcuni task, a cui vengono garantite determinate risorse CPU, o di aumentare la priorità di singole applicazioni. Lo scheduler è in fase di sviluppo da parte di Meta. La logica di generazione BPF operante nello spazio utente è scritta in linguaggio Rust.
- scx_rustland — uno scheduler ottimizzato per aumentare la priorità dei task interattivi rispetto ai task che caricano intensamente la CPU. Ad esempio, nel test di avvio dell'applicazione di gioco Terraria contemporaneamente alla compilazione del kernel, lo scheduler scx_rustland ha permesso di ottenere un FPS più elevato rispetto all'uso dello scheduler standard EEVDF. Il progetto è sviluppato da un dipendente di Canonical. La logica di generazione BPF operante nello spazio utente è scritta in linguaggio Rust.
- scx_lavd — implementazione dell'algoritmo di scheduling LAVD (Latency-criticality Aware Virtual Deadline), che tiene conto dell'importanza della riduzione dei ritardi per task specifici e utilizza informazioni sul progresso dei processi per prendere decisioni sulla distribuzione delle risorse CPU. Lo scheduler è sviluppato dalle aziende Igalia e Valve per ridurre i ritardi nei videogiochi e nelle task interattive. La logica di generazione BPF operante nello spazio utente è scritta in linguaggio Rust.
- scx_rusty, scx_rlfifo, scx_mitosis — esempi di scheduler con componenti nello spazio utente in linguaggio Rust, che implementano il bilanciamento tra gruppi di task in base al carico, un semplice scheduler FIFO e uno scheduler per l'associazione di gruppi di task ai core CPU.
- scx_central, scx_flatcg, scx_nest, scx_pair, scx_qmap, scx_simple, scx_userland — esempi di scheduler con componenti nello spazio utente in linguaggio C, che illustrano varie possibilità di sched-ext.
Inizialmente, il meccanismo sched_ext è stato proposto per la revisione dagli sviluppatori del kernel nel 2022, dopo di che sono state pubblicate sei edizioni della patch. Nonostante l'assenza di supporto nella versione principale del kernel, per le distribuzioni Ubuntu, Arch Linux, Fedora e NixOS è possibile installare sched_ext tramite pacchetti aggiuntivi. Canonical sta considerando di includere i componenti di sched-ext nella versione Ubuntu 24.10, mentre Valve sta lavorando all'integrazione di sched_ext in Steam Deck. Presso Meta, il pianificatore basato su sched_ext è già utilizzato nell'infrastruttura di lavoro.
Google sta sperimentando l'uso del proprio framework ghOSt, che consente di influenzare le decisioni del pianificatore di attività tramite programmi BPF. Attualmente, è iniziato il lavoro di porting di ghOSt su sched_ext. Google sta anche sviluppando un port di sched_ext per ChromeOS con l'intenzione di utilizzarlo per attivare il pianificatore ibrido scx_layered per ridurre le latenze senza utilizzare estensioni per funzionare in tempo reale. Oculus sta sviluppando un port di sched_ext per Android.
Fonte: opennet.ru
