Skip to main content

Cyber AI România

Marți, 29 septembrie 2026

sched_ext în Linux: cum rulezi un scheduler BPF cu scx_simple, îl măsori și revii automat la schedulerul standard

sched_ext permite încărcarea dinamică a unei politici de scheduling implementate în BPF, fără să înlocuiești permanent schedulerul kernelului. Când schedulerul BPF este oprit, produce o eroare sau lasă task-uri runnable blocate prea mult timp, kernelul revine automat la schedulerul fair standard. Acesta este unul dintre motivele pentru care sched_ext este interesant pentru experimente de scheduling care altfel ar necesita modificarea kernelului.

Pentru laborator vom folosi scx_simple, exemplul upstream minimal. Nu îl trata ca pe un upgrade universal de performanță: documentația kernelului îl prezintă în primul rând ca scheduler demonstrativ, iar rezultatele pot fi rezonabile în anumite workload-uri, mai ales pe sisteme single-socket cu topologie L3 simplă.

Verifică dacă kernelul suportă sched_ext

Începe cu:

uname -r

grep -E \
'CONFIG_(SCHED_CLASS_EXT|BPF|BPF_SYSCALL|BPF_JIT|DEBUG_INFO_BTF)=' \
/boot/config-"$(uname -r)"

Ai nevoie în special de:

CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_DEBUG_INFO_BTF=y
CONFIG_SCHED_CLASS_EXT=y

Kernelul upstream indică și opțiunile BPF JIT asociate ca parte din configurația recomandată pentru sched_ext.

Verifică starea curentă:

cat /sys/kernel/sched_ext/state
cat /sys/kernel/sched_ext/enable_seq

Înaintea primului test te aștepți, în mod normal, la:

disabled
0

enable_seq este un contor monoton; dacă este mai mare decât zero, un scheduler sched_ext a mai fost încărcat după ultimul boot.

Construiește scx_simple din sursa kernelului

Dacă distribuția nu furnizează deja binarul, cea mai clară variantă pentru laborator este arborele kernelului care conține tools/sched_ext.

Din rădăcina sursei:

make -j"$(nproc)" -C tools/sched_ext

Binarul rezultat este disponibil, în implementarea upstream curentă, sub:

tools/sched_ext/build/bin/scx_simple

Proiectul cere un toolchain BPF modern, iar documentația upstream avertizează că versiunile prea vechi de Clang, pahole sau BTF pot produce erori de build.

Rulează schedulerul și confirmă activarea

Într-un terminal:

sudo tools/sched_ext/build/bin/scx_simple

În altul:

cat /sys/kernel/sched_ext/state
cat /sys/kernel/sched_ext/root/ops

Ar trebui să vezi:

enabled
simple

În configurația normală, sched_ext poate prelua task-urile din clasele SCHED_NORMAL, SCHED_BATCH, SCHED_IDLE și SCHED_EXT, în funcție de flagurile schedulerului încărcat.

Nu presupune că schimbarea înseamnă automat performanță mai bună. scx_simple folosește implicit o politică simplă weighted virtual time și poate fi configurat și în mod FIFO; FIFO poate favoriza anumite workload-uri, dar poate afecta serios interactivitatea dacă thread-uri CPU-intensive domină coada.

Măsoară înainte și după

Folosește exact același workload, aceeași durată și aceeași configurație CPU.

Mai întâi, cu schedulerul standard:

perf stat -r 5 \
  -e task-clock,context-switches,cpu-migrations,cycles,instructions \
  -- ./benchmark

Notează:

timp total
throughput
context-switches
cpu-migrations
cycles
instructions
latența aplicației

Pornește apoi scx_simple și rulează exact aceeași comandă.

Pentru un test CPU reproductibil poți folosi și stress-ng:

stress-ng \
  --cpu "$(nproc)" \
  --timeout 30s \
  --metrics-brief

Nu compara un singur run. Rulează mai multe iterații și urmărește mediana sau distribuția rezultatelor. Un scheduler poate crește throughput-ul, dar simultan să înrăutățească latența task-urilor interactive.

Verifică și statisticile publicate de scheduler:

cat /sys/kernel/sched_ext/root/events

Disponibilitatea și poziția exactă a contoarelor pot varia între versiunile sched_ext, deoarece interfața BPF a acestui subsistem nu are garanții de stabilitate ABI între kerneluri.

Revino la schedulerul standard

Metoda normală este extrem de simplă: în terminalul unde rulează scx_simple, apasă:

Ctrl+C

Schedulerul BPF este dezînregistrat, iar task-urile revin la schedulerul fair al kernelului.

Confirmă:

cat /sys/kernel/sched_ext/state

Rezultatul trebuie să redevină:

disabled

Există și două mecanisme de siguranță importante: SysRq-S poate opri manual schedulerul sched_ext, iar watchdog-ul kernelului îl abandonează automat dacă detectează, printre altele, un task runnable blocat prea mult timp. Kernelul restaurează apoi scheduling-ul standard.

Tocmai aici este valoarea practică a sched_ext: poți experimenta cu politici BPF reale, măsura impactul pe workload-ul tău și reveni fără reboot. Dar scx_simple trebuie tratat ca instrument educațional și baseline de laborator, nu ca scheduler „mai rapid” în mod implicit.

Surse folosite

Linux Kernel Documentation — Extensible Scheduler Class (sched_ext), activare, watchdog, SysRq-S și fallback automat.

Linux Kernel tools/sched_ext — documentația și implementarea upstream pentru scx_simple.

sched-ext/scx — cerințe kernel/BPF și modul de încărcare/dezactivare a schedulerelor.

Linux Kernel Documentation — avertisment privind instabilitatea API/ABI sched_ext între versiuni de kernel.

Facebook
X
WhatsApp

Te-ar putea interesa si: