What the simulator said

Before writing the service, I simulated this box 5,100 times, an hour of arrivals each (5 scenarios, 3 machine sizes, 17 policies, 20 seeds), calibrated on benchmarks from the server it runs on. The plan was to show that splitting late work with a good forecast and a budget beats splitting on a timer. It does. But a plain pool that hands out ten images at a time, earliest deadline first, beats every splitting policy, and the reason is preemption: the pool reconsiders who gets a core every few seconds, while a worker that owns a task keeps its core until the task is done. That is why the box you press runs a pool, and why the splitting policies are exhibits.

Deadline hit rate on the cage (1.5 CPU, budget 2)

Policycalmskewneighbourburstpoison
never44%34%45%44%47%
static-456%36%52%54%56%
pool-1066%47%58%64%66%
timer+budget44%31%45%44%47%
forecast+budget56%31%52%54%56%
forecast+preempt67%35%57%64%66%
box6%5%8%7%11%
forecast4%4%7%5%5%

Share of submitted tasks finished by their deadline, mean of 20 seeds; rejected tasks count as misses. Hover a cell for its 95% interval.

Deadline hit rate by policy (cage) Share of submitted tasks finished by their deadline, mean and 95% interval over seeds. Rejected tasks count as misses. never static-4 pool-10 box timer+budget forecast forecast+budget perfect forecast+idle forecast+preempt calm 0% 50% 100% skew 0% 50% 100% neighbour 0% 50% 100% burst 0% 50% 100% poison 0% 50% 100%
Live worker processes during a burst (cage, seed 1) Processes alive each second, including ones still starting. burst: arrivals at 1.5× capacity 0 10 20 30 40 15 min 20 min 25 min 30 min 35 min 40 min box budget 2 pool-10 forecast+budget forecast+preempt
Goodput during a burst (cage, seed 1) Useful image work finished, as a share of the cores, 15 s rolling mean. Spawns, killed work and retries do not count. burst: arrivals at 1.5× capacity 0% 25% 50% 75% 100% 15 min 20 min 25 min 30 min 35 min 40 min forecast+budget box pool-10 forecast+preempt