Nel kernel di Linux arriverà la possibilità di utilizzare eBPF per creare pianificatori di attività.

Linus Torvalds ha espresso la sua disponibilità ad includere nel kernel di Linux 6.11, il cui rilascio è previsto per la fine di settembre, patch per l'implementazione del meccanismo "sched_ext" (SCX), che consente l'uso di eBPF per la creazione di pianificatori CPU che coprono praticamente tutti gli aspetti della pianificazione dell'esecuzione dei compiti e della distribuzione delle risorse CPU. Questi pianificatori possono essere caricati dinamicamente e vengono eseguiti all'interno del kernel di Linux in una macchina virtuale eBPF, dove, grazie all'uso della compilazione JIT, il bytecode viene tradotto in istruzioni di macchina e eseguito con prestazioni simili a quelle del codice compilato.

Le patch proposte implementano una nuova classe di pianificazione SCHED_EXT, per la quale viene impostata una priorità di chiamata dal kernel tra le classi SCHED_IDLE e SCHED_NORMAL, il che impedisce ai gestori BPF legati a SCHED_EXT di influenzare i compiti già attaccati al pianificatore di compiti standard (SCHED_NORMAL), ma consente l'attacco di compiti specifici a SCHED_EXT o lo spostamento di tutti i processi con priorità inferiore a quella dell'esecuzione in tempo reale per l'elaborazione tramite questo sistema. Se non ci sono gestori BPF associati a SCHED_EXT, tutti i processi spostati nella classe SCHED_EXT saranno gestiti dal pianificatore SCHED_NORMAL. Il lavoro dei gestori BPF consiste nell'analizzare le code dei compiti in attesa di esecuzione sulla CPU (una coda globale e una coda per ogni core CPU) e nella selezione del compito a cui attribuire le risorse CPU al rilascio della coda di un core CPU.

Il meccanismo sched_ext semplifica la creazione di pianificatori specifici per determinati compiti, consente di sperimentare con diverse tecniche e strategie di pianificazione, oltre a permettere la rapida creazione di prototipi funzionanti e la sostituzione dei pianificatori al volo nelle infrastrutture operative. Ad esempio, attraverso sched_ext è possibile creare un pianificatore che tenga conto delle specificità di una determinata applicazione e cambi dinamicamente la strategia di pianificazione della sua esecuzione in base allo stato del sistema e ad altri fattori.

Attualmente sono in fase di sviluppo circa una decina di pianificatori basati su sched_ext, la logica di pianificazione dei compiti dei quali è definita nello spazio utente e caricata nel kernel sotto forma di programmi BPF:

  • scx_layered — un pianificatore ibrido di attività che suddivide le attività in strati, ognuno dei quali utilizza una propria strategia di pianificazione. Ad esempio, scx_layered permette di isolare in uno strato separato alcune attività per le quali verranno fornite determinate risorse CPU garantite, o di aumentare la priorità di determinate applicazioni. Il pianificatore è sviluppato dall'azienda Meta. La logica di generazione BPF funziona nello spazio utente ed è scritta in Rust.
  • scx_rustland — un pianificatore ottimizzato per aumentare la priorità delle attività interattive rispetto a quelle che caricano intensamente la CPU. Ad esempio, nel test di avvio dell'applicazione di gioco Terraria insieme alla compilazione del kernel, il pianificatore scx_rustland ha permesso di ottenere un FPS più elevato nel gioco rispetto all'utilizzo del pianificatore standard EEVDF. Il progetto è sviluppato da un collaboratore dell'azienda Canonical. La logica di generazione BPF funziona nello spazio utente ed è scritta in Rust.
  • scx_lavd — implementazione dell'algoritmo di pianificazione LAVD (Latency-criticality Aware Virtual Deadline), che tiene conto dell'importanza di ridurre le latenze per attività specifiche e utilizza informazioni sullo stato di esecuzione dei processi per prendere decisioni sulla distribuzione delle risorse CPU. Il pianificatore è sviluppato dalle aziende Igalia e Valve per ridurre le latenze nei videogiochi e nelle attività interattive. La logica di generazione BPF funziona nello spazio utente ed è scritta in Rust.
  • scx_rusty, scx_rlfifo, scx_mitosis — esempi di pianificatori con componenti nello spazio utente scritti in Rust, che implementano il bilanciamento tra gruppi di attività in base al carico, il piano FIFO più semplice e un pianificatore per associare gruppi di attività ai core CPU.
  • scx_central, scx_flatcg, scx_nest, scx_pair, scx_qmap, scx_simple, scx_userland — esempi di pianificatori con componenti nello spazio utente scritti in C, che illustrano le diverse possibilità di sched-ext.

Inizialmente, il meccanismo sched_ext è stato proposto per l'esame degli sviluppatori del kernel nel 2022, dopodiché sono state pubblicate sei versioni del patch. Nonostante l'assenza di supporto nel core del kernel, gli utenti delle distribuzioni Ubuntu, Arch Linux, Fedora e NixOS hanno la possibilità di installare sched_ext tramite pacchetti aggiuntivi. L'azienda Canonical sta considerando di includere i componenti sched-ext nella versione Ubuntu 24.10, mentre Valve sta lavorando all'integrazione di sched_ext nel Steam Deck. Presso Meta, il pianificatore basato su sched_ext è già utilizzato nell'infrastruttura lavorativa.

L'azienda Google sta sperimentando l'uso del proprio framework ghOSt, che consente di influenzare le decisioni del pianificatore di processi tramite programmi BPF. Attualmente, è iniziato il lavoro per il 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 i ritardi senza l'uso di estensioni per il funzionamento in tempo reale. L'azienda Oculus sta sviluppando un port di sched_ext per Android.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster