Linus Torvalds a exprimat disponibilitatea de a include în nucleul Linux 6.11, al cărui lansare este așteptată la sfârșitul lunii septembrie, patch-uri cu implementarea mecanismului „sched_ext” (SCX), care permite utilizarea eBPF pentru a crea planificatoare CPU, acoperind practic toate aspectele planificării executării sarcinilor și distribuția resurselor CPU. Astfel de planificatoare pot fi încărcate dinamic și rulate în nucleul Linux într-o mașină virtuală eBPF, unde, datorită aplicării JIT-compilării, bytecode-ul este transformat în instrucțiuni mașină și executat cu performanța unui cod compilat.
Patch-urile propuse implementează o nouă clasă de planificare SCHED_EXT, pentru care prioritatea de apelare a nucleului între clasele SCHED_IDLE și SCHED_NORMAL este setată, ceea ce nu permite manipularea sarcinilor deja atașate la planificatorul standard de sarcini (SCHED_NORMAL) în handler-ele BPF legate de SCHED_EXT, dar oferă posibilitatea de a atașa sarcini individuale la SCHED_EXT sau de a muta pentru procesare toate procesele cu prioritate mai mică decât execuția în timp real. Dacă nu sunt atașate handler-e BPF la SCHED_EXT, toate procesele mutate în clasa SCHED_EXT vor fi procesate folosind planificatorul SCHED_NORMAL. Funcționarea handler-elor BPF se bazează pe analizarea cozilor de sarcini aflate în așteptare pentru execuție pe CPU (o coadă globală și câte o coadă pe fiecare nucleu CPU) și alegerea sarcinii căreia ar trebui să i se ofere resurse CPU odată ce un nucleu CPU devine disponibil.
Mecanismul sched_ext simplifică crearea planificatoarelor specifice pentru anumite sarcini, oferind posibilitatea de a experimenta cu diverse tehnici și strategii de planificare, precum și de a crea rapid prototipuri funcționale și de a schimba planificatoarele în timp real în infrastructurile de lucru. De exemplu, utilizând sched_ext, se poate crea un planificator care ia în considerare specificul unei aplicații anume și modifică dinamic strategia de planificare a execuției sale în funcție de starea sistemului și de alți factori suplimentari.
În prezent, deja se dezvoltă aproximativ zece planificatoare bazate pe sched_ext, logica de planificare a sarcinilor în care este definită în spațiul utilizatorului și încărcată în nucleu sub formă de programe BPF:
- scx_layered — un planificator hibrid de sarcini, care împarte sarcinile în straturi, pentru fiecare dintre care se aplică o strategie de planificare specifică. De exemplu, scx_layered permite alocarea unui strat separat pentru anumite sarcini, pentru care vor fi garantate resurse CPU specifice, sau creșterea priorității unor aplicații individuale. Planificatorul este dezvoltat de compania Meta. Logica de generare BPF care funcționează în spațiul utilizatorului este scrisă în limbajul Rust.
- scx_rustland — un planificator optimizat pentru a crește prioritatea sarcinilor interactive pe fundalul sarcinilor care solicită intens CPU. De exemplu, în testul de lansare a aplicației de joc Terraria simultan cu compilarea kernel-ului, planificatorul scx_rustland a permis obținerea unui FPS mai mare în joc decât utilizarea planificatorului standard EEVDF. Proiectul este dezvoltat de un angajat al companiei Canonical. Logica de generare BPF care funcționează în spațiul utilizatorului este scrisă în limbajul Rust.
- scx_lavd — o implementare a algoritmului de planificare a sarcinilor LAVD (Latency-criticality Aware Virtual Deadline), care ține cont de relevanța reducerii întârzierilor pentru sarcini specifice și folosește informații despre desfășurarea proceselor pentru a lua decizii privind alocarea resurselor CPU. Planificatorul este dezvoltat de companiile Igalia și Valve pentru a reduce întârzierile în jocurile pe computer și sarcinile interactive. Logica de generare BPF care funcționează în spațiul utilizatorului este scrisă în limbajul Rust.
- scx_rusty, scx_rlfifo, scx_mitosis — exemple de planificatoare cu componente în spațiul utilizatorului scrise în limbajul Rust, care implementează un echilibru între grupurile de sarcini în funcție de încărcare, un planificator FIFO simplu și un planificator pentru alocarea grupurilor de sarcini pe nuclee CPU.
- scx_central, scx_flatcg, scx_nest, scx_pair, scx_qmap, scx_simple, scx_userland — exemple de planificatoare cu componente în spațiul utilizatorului scrise în limbajul C, care ilustrează diversele posibilități ale sched-ext.
Mecanismul sched_ext a fost inițial propus pentru examinare de către dezvoltatorii nucleului în 2022, ulterior fiind publicate șase versiuni ale patch-ului. În ciuda lipsei de suport în nucleul principal, pentru distribuțiile Ubuntu, Arch Linux, Fedora și NixOS este oferită posibilitatea de a instala sched_ext prin pachete suplimentare. Compania Canonical ia în considerare includerea componentelor sched-ext în Ubuntu 24.10, iar compania Valve lucrează la integrarea sched_ext în Steam Deck. La Meta, planificatorul bazat pe sched_ext este deja utilizat în infrastructura operațională.
Compania Google experimentează utilizarea propriului cadru ghOSt, care influențează deciziile planificatorului de sarcini prin programe BPF. În prezent, au început lucrările de portare a ghOSt pe sched_ext. Google dezvoltă, de asemenea, un port sched_ext pentru ChromeOS cu intenția de a-l folosi pentru a activa planificatorul hibrid scx_layered pentru a reduce întârzierile fără a utiliza extensii pentru rularea în timp real. Compania Oculus dezvoltă un port sched_ext pentru Android.
Sursa: opennet.ro
