fix(scheduler): align(64) on SchedulerStats to prevent false sharing

Adding slot_hits + slot_displacements in RFC 005 grew SchedulerStats
from 16 to 32 bytes — exactly 2 per cache line. run_queue_len (written
on every push/pop by thread N) then false-shared with fields of thread
N+1, causing ~45-60% yield-storm regression at t≥8 visible equally in
slot-on and slot-off paths.
This commit is contained in:
smarm
2026-06-11 22:37:47 +02:00
parent 2708042990
commit 37d931968e
2 changed files with 142 additions and 141 deletions
+141 -141
View File
@@ -2,313 +2,313 @@
"chained_spawn": { "chained_spawn": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 1000, "result": 1000,
"median": 390, "median": 410,
"min": 380, "min": 379,
"max": 1872 "max": 2167
}, },
"smarm 24-thread": { "smarm 24-thread": {
"result": 1000, "result": 1000,
"median": 877, "median": 977,
"min": 834, "min": 883,
"max": 1289 "max": 1154
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 1000, "result": 1000,
"median": 57, "median": 72,
"min": 56, "min": 71,
"max": 62 "max": 80
}, },
"tokio multi-thread": { "tokio multi-thread": {
"result": 1000, "result": 1000,
"median": 188, "median": 216,
"min": 174, "min": 171,
"max": 213 "max": 257
} }
}, },
"yield_many": { "yield_many": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 200000, "result": 200000,
"median": 16992, "median": 15617,
"min": 16132, "min": 15039,
"max": 20241 "max": 16240
}, },
"smarm 24-thread": { "smarm 24-thread": {
"result": 200000, "result": 200000,
"median": 110968, "median": 155738,
"min": 109901, "min": 149294,
"max": 113206 "max": 157106
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 200000, "result": 200000,
"median": 4874, "median": 4820,
"min": 4812, "min": 4771,
"max": 4915 "max": 5091
}, },
"tokio multi-thread": { "tokio multi-thread": {
"result": 200000, "result": 200000,
"median": 8667, "median": 8403,
"min": 7713, "min": 7445,
"max": 9942 "max": 9752
} }
}, },
"fan_out_compute": { "fan_out_compute": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 33860, "result": 33860,
"median": 13249, "median": 13412,
"min": 13189, "min": 13361,
"max": 13350 "max": 13917
}, },
"smarm 24-thread": { "smarm 24-thread": {
"result": 33860, "result": 33860,
"median": 2448, "median": 2359,
"min": 2279, "min": 2158,
"max": 3147 "max": 2631
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 33860, "result": 33860,
"median": 12319, "median": 14138,
"min": 12299, "min": 13512,
"max": 12460 "max": 14236
}, },
"tokio multi-thread": { "tokio multi-thread": {
"result": 33860, "result": 33860,
"median": 1605, "median": 1532,
"min": 1363, "min": 1455,
"max": 2695 "max": 2447
} }
}, },
"ping_pong_oneshot": { "ping_pong_oneshot": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 1000, "result": 1000,
"median": 912, "median": 983,
"min": 875, "min": 853,
"max": 971 "max": 1166
}, },
"smarm 24-thread": { "smarm 24-thread": {
"result": 1000, "result": 1000,
"median": 1540, "median": 1562,
"min": 1430, "min": 1466,
"max": 1815 "max": 1726
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 1000, "result": 1000,
"median": 376, "median": 421,
"min": 360, "min": 405,
"max": 548 "max": 634
}, },
"tokio multi-thread": { "tokio multi-thread": {
"result": 1000, "result": 1000,
"median": 10736, "median": 9254,
"min": 8365, "min": 7836,
"max": 13093 "max": 11613
} }
}, },
"spawn_storm_busy": { "spawn_storm_busy": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 10000, "result": 10000,
"median": 106102, "median": 108420,
"min": 95978, "min": 107179,
"max": 111386 "max": 110463
}, },
"smarm 24-thread": { "smarm 24-thread": {
"result": 10000, "result": 10000,
"median": 69661, "median": 49405,
"min": 67241, "min": 48118,
"max": 72895 "max": 51497
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 10000, "result": 10000,
"median": 1150, "median": 1157,
"min": 1141, "min": 1152,
"max": 1180 "max": 1194
}, },
"tokio multi-thread": { "tokio multi-thread": {
"result": 10000, "result": 10000,
"median": 18821, "median": 20476,
"min": 16107, "min": 15912,
"max": 25494 "max": 31254
} }
}, },
"mpsc_contention": { "mpsc_contention": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 320000, "result": 320000,
"median": 3535, "median": 6270,
"min": 3439, "min": 6133,
"max": 3804 "max": 6932
}, },
"smarm 24-thread": { "smarm 24-thread": {
"result": 320000, "result": 320000,
"median": 36652, "median": 34690,
"min": 33385, "min": 32198,
"max": 39609 "max": 38480
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 320000, "result": 320000,
"median": 5510, "median": 6022,
"min": 5402, "min": 5901,
"max": 6584 "max": 6185
}, },
"tokio multi-thread": { "tokio multi-thread": {
"result": 320000, "result": 320000,
"median": 52301, "median": 59561,
"min": 37540, "min": 43293,
"max": 78902 "max": 72976
} }
}, },
"many_timers": { "many_timers": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 10000, "result": 10000,
"median": 105353, "median": 120756,
"min": 101581, "min": 108228,
"max": 125061 "max": 126568
}, },
"smarm 24-thread": { "smarm 24-thread": {
"result": 10000, "result": 10000,
"median": 95839, "median": 97810,
"min": 92306, "min": 93054,
"max": 98854 "max": 100845
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 10000, "result": 10000,
"median": 12568, "median": 12554,
"min": 12372, "min": 12425,
"max": 12675 "max": 13280
}, },
"tokio multi-thread": { "tokio multi-thread": {
"result": 10000, "result": 10000,
"median": 16393, "median": 16463,
"min": 15434, "min": 15913,
"max": 17018 "max": 17058
} }
}, },
"multi_thread_scaling": { "multi_thread_scaling": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 33860, "result": 33860,
"median": 15063, "median": 15086,
"min": 14963, "min": 15046,
"max": 15957 "max": 15274
}, },
"smarm 2-thread": { "smarm 2-thread": {
"result": 33860, "result": 33860,
"median": 8075, "median": 8057,
"min": 7799, "min": 7948,
"max": 13446 "max": 8227
}, },
"smarm 4-thread": { "smarm 4-thread": {
"result": 33860, "result": 33860,
"median": 4396, "median": 4476,
"min": 4312, "min": 4353,
"max": 4650 "max": 4605
}, },
"smarm 24-thread": { "smarm 24-thread": {
"result": 33860, "result": 33860,
"median": 2278, "median": 2383,
"min": 2145, "min": 2231,
"max": 2480 "max": 2868
}, },
"tokio multi 1-thread": { "tokio multi 1-thread": {
"result": 33860, "result": 33860,
"median": 14203, "median": 14301,
"min": 14163, "min": 14176,
"max": 14723 "max": 14484
}, },
"tokio multi 2-thread": { "tokio multi 2-thread": {
"result": 33860, "result": 33860,
"median": 7346, "median": 7293,
"min": 7143, "min": 7190,
"max": 7587 "max": 7455
}, },
"tokio multi 4-thread": { "tokio multi 4-thread": {
"result": 33860, "result": 33860,
"median": 3782, "median": 3768,
"min": 3699, "min": 3690,
"max": 4305 "max": 3861
}, },
"tokio multi 24-thread": { "tokio multi 24-thread": {
"result": 33860, "result": 33860,
"median": 1757, "median": 1585,
"min": 1255, "min": 1312,
"max": 2058 "max": 2239
} }
}, },
"deep_recursion": { "deep_recursion": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 1, "result": 1,
"median": 227, "median": 240,
"min": 214, "min": 219,
"max": 1685 "max": 2111
}, },
"smarm 24-thread": { "smarm 24-thread": {
"result": 1, "result": 1,
"median": 744, "median": 782,
"min": 706, "min": 708,
"max": 802 "max": 983
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 1, "result": 1,
"median": 11, "median": 10,
"min": 10, "min": 10,
"max": 12 "max": 12
}, },
"tokio multi-thread": { "tokio multi-thread": {
"result": 1, "result": 1,
"median": 53, "median": 53,
"min": 43, "min": 40,
"max": 59 "max": 70
} }
}, },
"yield_in_hot_loop": { "yield_in_hot_loop": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 1000000, "result": 1000000,
"median": 65826, "median": 64650,
"min": 64361, "min": 64154,
"max": 66076 "max": 66049
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 1000000, "result": 1000000,
"median": 75553, "median": 73761,
"min": 75338, "min": 70903,
"max": 76179 "max": 74957
} }
}, },
"uncontended_channel": { "uncontended_channel": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 1000000, "result": 1000000,
"median": 13502, "median": 13745,
"min": 10935, "min": 11201,
"max": 13626 "max": 14048
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 1000000, "result": 1000000,
"median": 16994, "median": 17067,
"min": 16968, "min": 17054,
"max": 17030 "max": 17092
} }
}, },
"catch_unwind_panics": { "catch_unwind_panics": {
"smarm 1-thread": { "smarm 1-thread": {
"result": 10000, "result": 10000,
"median": 108080, "median": 109788,
"min": 105901, "min": 108526,
"max": 122945 "max": 113713
}, },
"smarm 24-thread": { "smarm 24-thread": {
"result": 10000, "result": 10000,
"median": 11650, "median": 13864,
"min": 11110, "min": 12963,
"max": 12260 "max": 14602
}, },
"tokio current_thread": { "tokio current_thread": {
"result": 10000, "result": 10000,
"median": 9680, "median": 9624,
"min": 9437, "min": 9407,
"max": 10924 "max": 11185
}, },
"tokio multi-thread": { "tokio multi-thread": {
"result": 10000, "result": 10000,
"median": 5625, "median": 5224,
"min": 3051, "min": 2805,
"max": 7275 "max": 7833
} }
} }
} }
+1
View File
@@ -275,6 +275,7 @@ impl Default for Config {
/// Lockless per-scheduler-thread counters. Written only by the owning thread; /// Lockless per-scheduler-thread counters. Written only by the owning thread;
/// readable from any thread (introspection actor, tests). /// readable from any thread (introspection actor, tests).
#[repr(align(64))]
pub struct SchedulerStats { pub struct SchedulerStats {
/// PID index of the actor currently on-CPU, or `u32::MAX` when idle. /// PID index of the actor currently on-CPU, or `u32::MAX` when idle.
pub current_pid_index: AtomicU32, pub current_pid_index: AtomicU32,