13 个版本

0.5.8 2024 年 8 月 6 日
0.5.7 2024 年 8 月 2 日
0.5.6 2024 年 4 月 9 日
0.5.5 2024 年 2 月 23 日
0.4.9 2024 年 2 月 7 日

#325并发

Download history 4/week @ 2024-05-17 9/week @ 2024-05-24 6/week @ 2024-05-31 3/week @ 2024-06-07 2/week @ 2024-06-14 17/week @ 2024-07-05 104/week @ 2024-07-26 373/week @ 2024-08-02 16/week @ 2024-08-09

493 每月下载量
用于 2 crates

ISC 许可证

52KB
1K SLoC

smolscale

使用工作平衡的 [async-task] 全局自动缩放调度器。

什么?另一个执行器?

smolscale 是一个基于 [async-task] 的 工作平衡 执行器,旨在作为 smolasync-global-executor 的直接替换。它基于这样一个想法:在异步执行器(如 async-executortokio)中常用的“工作窃取”算法,对于大量微小且相互依赖的工作单元来说并不适合,这正是消息传递未来的结果。相反,smolscale 使用了 工作平衡,这是一种在 Erlang 中也能找到的方法,其中全局的“平衡”线程会定期在工作者之间平衡工作,但工作者不会试图从彼此那里窃取任务。这避免了在工作窃取调度器应用于异步任务时产生的非常频繁的窃取尝试。

smolscale 的方法在两种情况下表现尤其出色

  • 当 CPU 核心未满载时:传统的窃取工作优化了大多数工作者都有工作要做的情况,这只有在完全负载的情况下才是这种情况。然而,当工作者经常醒来又回去睡觉时,会浪费很多 CPU 时间在窃取工作上。smolscale 将在这些情况下极大地减少 CPU 使用率——一个占用 80% CPU 时间的 async-executor 应用现在可能只需占用 20%。虽然这并不提高完全负载的吞吐量,但它显著降低了功耗,并在多个线程池竞争 CPU 时间的情况下增加了吞吐量。
  • 当发生大量消息传递时:消息传递工作负载通常涉及任务快速唤醒又回去睡觉。在工作窃取调度器中,这又会使调度器充满窃取请求。smolscale 可以显著提高吞吐量,尤其是在与不特别处理消息传递的执行器(如 async-executor)相比时。

许可证:ISC

依赖关系

~11–42MB
~660K SLoC