Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

What is scheduling?

Slide 3

Slide 3 text

Process A Process B CPU 1 ... CPU 2 ...

Slide 4

Slide 4 text

Process A Process B CPU Time

Slide 5

Slide 5 text

Process A Process B CPU A Time

Slide 6

Slide 6 text

Process A Process B CPU A Time

Slide 7

Slide 7 text

Process A Process B CPU A Time B

Slide 8

Slide 8 text

Process A Process B CPU A Time B A

Slide 9

Slide 9 text

Process A Process B CPU A Time B A A

Slide 10

Slide 10 text

Process A Process B CPU A Time B A B A

Slide 11

Slide 11 text

Process A Process B CPU A Time B A B A A

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

Runs on this machine

Slide 14

Slide 14 text

What is the performance? Good* * For a typical Java benchmark

Slide 15

Slide 15 text

Why?

Slide 16

Slide 16 text

1.Ease of experimentation and exploration 2.Customization 3.Rapid scheduler deployments https://lwn.net/Articles/978911/ “

Slide 17

Slide 17 text

How does it work?

Slide 18

Slide 18 text

CPU sched-ext User land Kernel land Hardware Java Code C Code Byte Code Loaded attach

Slide 19

Slide 19 text

Show me the code

Slide 20

Slide 20 text

@BPF(license = "GPL") public abstract class SampleScheduler extends BPFProgram implements Scheduler, Runnable { static final long SHARED_DSQ_ID = 0; @Type static class Stats { long global; long local; } @Override public int init() { return scx_bpf_create_dsq(SHARED_DSQ_ID, -1); } }

Slide 21

Slide 21 text

@BPF(license = "GPL") public abstract class SampleScheduler { @BPFMapDefinition(maxEntries = 100) BPFHashMap statsPerCPU; @BPFMapDefinition(maxEntries = 100000) BPFLRUHashMap<@Unsigned Integer, @Unsigned Long> enqueuesPerProcess; }

Slide 22

Slide 22 text

@BPF(license = "GPL") public abstract class SampleScheduler { @Override public int selectCPU(Ptr p, int prev_cpu, long wake_flags) { boolean is_idle = false; int cpu = scx_bpf_select_cpu_dfl(p, prev_cpu, wake_flags, Ptr.of(is_idle)); if (is_idle) { !/* !!... / } return cpu; } } *

Slide 23

Slide 23 text

@BPF(license = "GPL") public abstract class SampleScheduler { @Override public void enqueue(Ptr p, long enq_flags) { incrementStats(false); recordEnqueue(p); scx_bpf_dispatch(p, SHARED_DSQ_ID, SCX_SLICE_DFL.value(), enq_flags); } }

Slide 24

Slide 24 text

@BPF(license = "GPL") public abstract class SampleScheduler { @Override public void dispatch(int cpu, Ptr prev) { scx_bpf_consume(SHARED_DSQ_ID); } }

Slide 25

Slide 25 text

Why in Java?

Slide 26

Slide 26 text

Why not?

Slide 27

Slide 27 text

Testing

Slide 28

Slide 28 text

Race conditions Process A Process B Data(uid=0, gid=0, counter=10) set get ⚡

Slide 29

Slide 29 text

Deadlock Lock 1 Process A Process B own want want Lock 2 own ⚡

Slide 30

Slide 30 text

+ = Better testing of concurrency

Slide 31

Slide 31 text

Can we use it?

Slide 32

Slide 32 text

Sched-ext is not yet in main-line

Slide 33

Slide 33 text

When will sched-ext be merged? I will knock wood, because I was sure it was going to be in 6.11, but yes it looks like we're now looking at 6.12. https://www.youtube.com/watch?v=nJMEuBwMD18 https://www.facesofopensource.com/linus-torvalds/ “

Slide 34

Slide 34 text

is a prototype

Slide 35

Slide 35 text

Fi#. Thanks to Dylan Reimerink sched-ext Slack Johannes Bechberger mostlynerdless.de OpenJDK Developer, SAP