FlexGuard: Fast Mutual Exclusion Independent of Subscription (SOSP 2025)
一句话总结:用 eBPF hook 在内核 context switch 时精确检测锁持有者被抢占,把等待线程从 spin 转为 block——非 oversubscribed 下吞吐 1-6× 优于 POSIX,oversubscribed 下最多 5×,不再靠启发式 timeout。
问题
Spinlock 在非 oversubscribed 场景性能好,但线程数超过硬件上下文数时会”性能雪崩”——等待者 spin 占满 CPU,锁持有者被调度器抢占,临界路径无法推进,MCS 的临界段延迟可暴涨 4 个数量级。
已有混合方案(POSIX spin-then-park、Shuffle、MCS-TP、Malthusian、Antić 等)依赖启发式 timeout 或定期探测线程数,要么过早 block(损失 spin 优势)要么过晚 block(撞上 preemption)。根本问题在于把 OS 调度器当黑盒,只能间接推断 preemption。
核心方法
Key insight:通过 eBPF 挂钩 sched_switch tracepoint,内核每次 context switch 都同步暴露被抢占线程的 PC、栈、寄存器,能精确判断它是否在临界段内。
- Critical-section detection:eBPF hook 读出 preempted 线程的 PC,若落在已注册的 CS 范围内,就向锁 metadata 发信号。
- Lock algorithm:借鉴 Shuffle lock(MCS 队列 + TATAS fast path,每线程一个队列节点而非每线程每锁一个),但当检测到 CS preemption 后,所有当前 waiter 立即 block(通过 futex),让出 CPU 让持有者恢复运行;持有者返回后 waiter 被唤醒继续。
- 无需改内核:完全靠 eBPF,可在现代 Linux 上部署。
关键结果
- 微基准、LevelDB、PARSEC Dedup、SPLASH2X Raytrace/Streamcluster:非 oversubscribed 下 1-6× 优于 POSIX;oversubscribed 下最多 5×。
- 非 oversubscribed 性能接近 MCS(spinlock 最优 baseline),oversubscribed 不雪崩,接近 pure blocking lock。
- 不依赖手调 timeout,subscription-agnostic。