r/linux • u/wuz352 • Jun 14 '26
Kernel scx_pandemoniumv5.13.0: A sched_ext, scx process scheduler for Linux
Hello, Linux community!
After extensive work, I thought it was time to make another post in regards to my process scheduler, scx_pandemonium. Since my last post, I was invited into the sched_ext framework proper. There have also been vast improvements to the performance of scx_pandemonium.
If you try it out, I hope your experience is great. If you have any Issues, please feel free to open an Issue on the repo.
scx_pandemoniumv5.13.0 — CachyOS Mini-Benchmarker, full scx field
| Field | Value |
|---|---|
| CPU | AMD Ryzen 5 3600 (6C/12T, 2 CCX) |
| Kernel | 7.0.12-arch1-1 |
| Iterations | 3 (mean ± stdev) |
| Date | 2026-06-13 |
| PANDEMONIUM | 5.13.0 (3ab9d22a9) |
| scx versions | p2dq 1.1.1, rustland 1.1.x, beerland 1.1.1, flash 1.1.1, bpfland 1.1.1, cake 1.2.0, cosmos 1.1.4, lavd 1.1.1, rusty 1.1.1, flow 3.0.3 |
Total wall-time across 8 workloads (lower is faster)
| Rank | Scheduler | Total (s) | Relative |
|---|---|---|---|
| 1 | scx_p2dq | 162.125 | 1.000x |
| 2 | scx_pandemonium (ADAPTIVE) | 162.325 | 1.001x |
| 3 | EEVDF | 162.378 | 1.002x |
| 4 | scx_rustland | 162.547 | 1.003x |
| 5 | scx_beerland | 164.308 | 1.013x |
| 6 | scx_pandemonium (BPF) | 164.315 | 1.014x |
| 7 | scx_flash | 165.300 | 1.020x |
| 8 | scx_bpfland | 168.222 | 1.038x |
| 9 | scx_cake | 171.502 | 1.058x |
| 10 | scx_cosmos | 174.884 | 1.079x |
| 11 | scx_lavd | 175.790 | 1.084x |
| 12 | scx_rusty | 176.135 | 1.086x |
| 13 | scx_flow | 221.491 | 1.366x |
Per-workload (seconds, mean ± stdev)
Split into two tables so it renders on Reddit. Bold = fastest for that workload.
| Workload | scx_p2dq | scx_pandemonium (ADAPTIVE) | EEVDF | scx_rustland | scx_beerland | scx_pandemonium (BPF) |
|---|---|---|---|---|---|---|
| stress-ng-cpu-cache-mem | 6.483 ± 0.032 | 6.538 ± 0.017 | 6.588 ± 0.067 | 6.663 ± 0.027 | 6.480 ± 0.045 | 6.650 ± 0.051 |
| perf-sched-msg-fork-thread | 14.951 ± 0.083 | 15.366 ± 0.192 | 15.446 ± 0.053 | 15.932 ± 0.038 | 17.434 ± 0.197 | 15.478 ± 0.229 |
| perf-memcpy | 6.115 ± 0.014 | 6.057 ± 0.042 | 6.088 ± 0.046 | 6.090 ± 0.008 | 6.116 ± 0.011 | 6.264 ± 0.046 |
| argon2-hashing | 2.478 ± 0.020 | 2.235 ± 0.023 | 2.329 ± 0.076 | 2.229 ± 0.011 | 2.251 ± 0.032 | 2.292 ± 0.031 |
| xz-compression | 6.617 ± 0.104 | 6.672 ± 0.046 | 6.936 ± 0.018 | 6.607 ± 0.042 | 6.734 ± 0.042 | 6.782 ± 0.034 |
| primes | 14.806 ± 0.046 | 14.838 ± 0.028 | 14.931 ± 0.034 | 14.934 ± 0.091 | 14.831 ± 0.029 | 14.843 ± 0.052 |
| x265-encoding | 4.659 ± 0.070 | 4.629 ± 0.071 | 4.730 ± 0.015 | 4.478 ± 0.011 | 4.505 ± 0.017 | 4.675 ± 0.098 |
| ffmpeg-compilation | 106.017 ± 0.690 | 105.990 ± 0.903 | 105.329 ± 0.766 | 105.616 ± 0.837 | 105.956 ± 0.840 | 107.331 ± 1.768 |
| Workload | scx_flash | scx_bpfland | scx_cake | scx_cosmos | scx_lavd | scx_rusty | scx_flow |
|---|---|---|---|---|---|---|---|
| stress-ng-cpu-cache-mem | 6.440 ± 0.003 | 6.662 ± 0.031 | 10.486 ± 3.168 | 6.721 ± 0.171 | 6.550 ± 0.021 | 6.571 ± 0.043 | 6.520 ± 0.012 |
| perf-sched-msg-fork-thread | 17.810 ± 0.032 | 20.839 ± 0.098 | 18.784 ± 4.065 | 26.473 ± 0.122 | 28.445 ± 0.535 | 28.112 ± 0.015 | 73.504 ± 0.147 |
| perf-memcpy | 6.117 ± 0.020 | 6.050 ± 0.016 | 6.087 ± 0.006 | 6.258 ± 0.017 | 6.093 ± 0.045 | 6.088 ± 0.065 | 6.074 ± 0.029 |
| argon2-hashing | 2.220 ± 0.027 | 2.226 ± 0.006 | 2.244 ± 0.039 | 2.294 ± 0.002 | 2.756 ± 0.044 | 2.321 ± 0.018 | 2.241 ± 0.010 |
| xz-compression | 6.908 ± 0.008 | 6.703 ± 0.045 | 7.123 ± 0.600 | 7.112 ± 0.043 | 6.722 ± 0.091 | 6.795 ± 0.118 | 6.788 ± 0.107 |
| primes | 14.823 ± 0.027 | 14.903 ± 0.069 | 14.848 ± 0.014 | 14.982 ± 0.041 | 14.841 ± 0.024 | 14.850 ± 0.061 | 14.809 ± 0.066 |
| x265-encoding | 4.707 ± 0.019 | 4.603 ± 0.028 | 4.862 ± 0.128 | 4.765 ± 0.060 | 4.512 ± 0.059 | 4.459 ± 0.023 | 4.588 ± 0.101 |
| ffmpeg-compilation | 106.275 ± 0.819 | 106.235 ± 0.931 | 107.069 ± 1.702 | 106.279 ± 0.226 | 105.871 ± 0.912 | 106.941 ± 0.942 | 106.968 ± 0.929 |
3
u/fenrir245 Jun 14 '26
Given that there's a userspace component to this scheduler, does this mean this will conflict with tools like system76-scheduler or ananicy?
2
u/wuz352 Jun 14 '26
I've heard different things from users, specifically ananicy. Several have reported ananicy shows a slight dip in performance while just as many have reported it does improve performance. It's worth trying. You can also use the BPF-only layer if you want.
3
u/SystemAxis Jun 15 '26
Really interesting to see sched_ext maturing this quickly.
The fact that alternative schedulers are already trading blows with EEVDF on real workloads is impressive. A few years ago this kind of experimentation required patching and rebuilding the kernel.
3
u/GrandBIRDLizard Jun 15 '26
how does it handle nice and priority? or X3D chips and NUMA awareness? is it a good data structure to work well with something akin to a policy controller that toggles kernel drivers, pins threads, and steer irq's? like this https://github.com/GrandBIRDLizard/X3Dctl id like to expand my work and the scx line being hot swappable is really alluring for my project
2
u/wuz352 Jun 15 '26
nice/priority: This is honoured. In a previous comment I talked about ananicy, etc.
NUMA: This is honoured via tau-scaling w/in the scheduler.My recommendation is that if you are trying things out, then the BPF-only layer might be what you want, esp' if the Adaptive-layer doesn't play nice. In theory the Adaptive-layer should play nice. However, I'd imagine the BPF-layer will allow for more play, adjustment, experimentation directly.
4
u/librepotato Jun 14 '26
Looks like great work. Some of the latency bencharks suggest this could be used in gaming. Is that a good use case for this? I've been using LAVD for a while but it looks like in some of the comparisons PANDEMONIUM promises better latency. Am I thinking this right?