我在研究 Tokio 多线程调度器时,发现了一个任务饥饿的边界情况:在特定负载下,本地队列的任务会持续抢占,导致全局队列里的任务长时间得不到调度。
我做了什么
- 复现并定位问题:写了一个最小复现用例,证明全局队列在高并发本地唤醒下会被"饿死"。
- 提交修复:引入一个周期性检查全局队列的计数器,保证公平性,同时不引入明显开销。
- 补充基准:用
criterion验证修复前后吞吐无回退。
收获
深入读了 work-stealing 调度器的实现,理解了"公平性 vs 吞吐"在真实运行时里的权衡。相关原理我整理在〔深入理解 Rust 异步运行时〕一文。