benches: expose preemption knobs + sweep runner
Config API changes (src/preempt.rs, src/runtime.rs):
- preempt: promote ALLOC_INTERVAL and TIMESLICE_CYCLES from bare consts to
DEFAULT_ALLOC_INTERVAL / DEFAULT_TIMESLICE_CYCLES; store active values in
thread-locals set on each actor resume so multiple runtimes can use
different settings concurrently.
- runtime: add alloc_interval / timeslice_cycles fields to Config; add
Config::alloc_interval(n) and Config::timeslice_cycles(c) builder methods;
thread the values through RuntimeInner to the reset_timeslice() call in
schedule_loop.
Bench changes:
- Add bench_cfg(threads) helper to general/tokio_favored/smarm_favored that
wraps Config::exact and reads SMARM_ALLOC_INTERVAL / SMARM_TIMESLICE_CYCLES
env vars, so the sweep script can vary knobs without recompiling.
Sweep tooling (benches/sweep.py):
- 'run': run the 3-file bench suite once; --save-baseline persists JSON
- 'regress': compare current run against baseline.json, exit 1 on any bench
that regresses >10% vs stored medians
- 'sweep': run the full SWEEP_GRID (10 points), print comparison table,
optional --save-csv; binaries pre-built so no recompile per point
Sweep results (10-point grid, 1-CPU sandbox):
- The preemption knobs have very little effect on this single-CPU machine.
Most benches move <5% across the entire grid.
- Longer timeslices (tc=600k, tc=1200k) reliably hurt spawn_storm_busy
(+11-15%) and catch_unwind_panics (+10-12%) because actors hold the
scheduler mutex longer per timeslice, stalling the storm of joinable tasks.
- Shorter timeslices (tc=150k) give a small improvement on many_timers
(-3-4%) and a wash everywhere else.
- yield_in_hot_loop and uncontended_channel are essentially flat across all
knobs — both are scheduling-dominated and call yield_now explicitly, so
the RDTSC-driven preemption path is irrelevant.
- Conclusion: the knobs matter primarily under contention (multi-core).
Re-run sweep on a multi-core machine before drawing tuning conclusions.
This commit is contained in:
126
benches/baseline-output/sweep/ai256_tc300k.txt
Normal file
126
benches/baseline-output/sweep/ai256_tc300k.txt
Normal file
@@ -0,0 +1,126 @@
|
||||
smarm general benchmarks
|
||||
available parallelism: 1 threads
|
||||
ITERS=15 (+1 warmup, discarded)
|
||||
CHAIN_DEPTH=1000, YIELD_TASKS=200×1000, PRIME_N=400000/64 workers, PP_ROUNDS=1000
|
||||
|
||||
================================================================================
|
||||
chained_spawn: depth 1000
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 1000 | 9130 | 8720 | 10611
|
||||
smarm 1-thread | 1000 | 8808 | 8617 | 9659
|
||||
tokio current_thread | 1000 | 126 | 125 | 164
|
||||
tokio multi-thread | 1000 | 190 | 184 | 329
|
||||
|
||||
================================================================================
|
||||
yield_many: 200 tasks × 1000 yields
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 200000 | 42270 | 41814 | 44737
|
||||
smarm 1-thread | 200000 | 42999 | 42104 | 45424
|
||||
tokio current_thread | 200000 | 15441 | 15196 | 16096
|
||||
tokio multi-thread | 200000 | 16249 | 16070 | 17620
|
||||
|
||||
================================================================================
|
||||
fan_out_compute: primes in [2, 400000) across 64
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 33860 | 29813 | 29627 | 30176
|
||||
smarm 1-thread | 33860 | 29613 | 29440 | 31205
|
||||
tokio current_thread | 33860 | 28637 | 28406 | 29179
|
||||
tokio multi-thread | 33860 | 34472 | 34389 | 36092
|
||||
|
||||
================================================================================
|
||||
ping_pong_oneshot: 1000 rounds
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 1000 | 16899 | 16804 | 17017
|
||||
smarm 1-thread | 1000 | 17001 | 16704 | 19533
|
||||
tokio current_thread | 1000 | 914 | 893 | 1021
|
||||
tokio multi-thread | 1000 | 4198 | 4136 | 4297
|
||||
smarm tokio-favored benchmarks
|
||||
available parallelism: 1 threads
|
||||
ITERS=15 (+1 warmup, discarded)
|
||||
STORM_BACKGROUND=8, STORM_SPAWN=10000, MPSC=32×10000, TIMER_ACTORS=10000 (1–10 ms), SCALING_N=400000/64
|
||||
|
||||
================================================================================
|
||||
spawn_storm_busy: 8 bg yielders + 10000 zero-work spawns
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 10000 | 128621 | 126503 | 132268
|
||||
smarm 1-thread | 10000 | 131316 | 128354 | 133964
|
||||
tokio current_thread | 10000 | 2763 | 2696 | 2996
|
||||
tokio multi-thread | 10000 | 6023 | 4300 | 12908
|
||||
|
||||
================================================================================
|
||||
mpsc_contention: 32 producers × 10000 msgs → 1 consumer
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 320000 | 9225 | 9071 | 11272
|
||||
smarm 1-thread | 320000 | 9174 | 9028 | 9335
|
||||
tokio current_thread | 320000 | 17210 | 17100 | 18404
|
||||
tokio multi-thread | 320000 | 17550 | 17413 | 18080
|
||||
|
||||
================================================================================
|
||||
many_timers: 10000 actors sleeping 1–10 ms
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 10000 | 136396 | 133330 | 142485
|
||||
smarm 1-thread | 10000 | 137374 | 134345 | 141168
|
||||
tokio current_thread | 10000 | 13789 | 13499 | 14621
|
||||
tokio multi-thread | 10000 | 15036 | 14729 | 15359
|
||||
|
||||
================================================================================
|
||||
multi_thread_scaling: primes in [2, 400000) across 64 workers
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 33860 | 30065 | 29819 | 32418
|
||||
tokio multi 1-thread | 33860 | 29501 | 28916 | 30057
|
||||
smarm smarm-favored benchmarks
|
||||
available parallelism: 1 threads
|
||||
ITERS=15 (+1 warmup, discarded)
|
||||
RECURSE_DEPTH=500, HOT_YIELDS=500000×2, UNCONT_MSGS=1000000, PANIC_TASKS=10000
|
||||
|
||||
================================================================================
|
||||
deep_recursion: depth 500
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 1 | 94 | 81 | 257
|
||||
smarm 1-thread | 1 | 83 | 80 | 134
|
||||
tokio current_thread | 1 | 25 | 25 | 33
|
||||
tokio multi-thread | 1 | 57 | 48 | 109
|
||||
|
||||
================================================================================
|
||||
yield_in_hot_loop: 2 actors × 500000 yields (single thread)
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 1000000 | 188506 | 187971 | 190121
|
||||
tokio current_thread | 1000000 | 149663 | 148978 | 150733
|
||||
|
||||
================================================================================
|
||||
uncontended_channel: 1→1, 1000000 msgs (single thread)
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 1000000 | 26945 | 26703 | 29430
|
||||
tokio current_thread | 1000000 | 52332 | 51838 | 54062
|
||||
|
||||
================================================================================
|
||||
catch_unwind_panics: 10000 tasks, 50% panic
|
||||
================================================================================
|
||||
runtime | result | median µs | min µs | max µs
|
||||
--------------------------------------------------------------------------------
|
||||
smarm 1-thread | 10000 | 146192 | 143776 | 150609
|
||||
smarm 1-thread | 10000 | 144012 | 140604 | 153892
|
||||
tokio current_thread | 10000 | 268341 | 260941 | 275404
|
||||
tokio multi-thread | 10000 | 272691 | 268094 | 307084
|
||||
Reference in New Issue
Block a user