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