这是一个用 Rust 编写的低延迟、线程间通信库。
特征
- 单一生产者单一消费者 (SPSC)。
- 多生产者单消费者 (MPSC)。
- 具有消费者相互依赖关系的多生产者多消费者 (MPMC)。
- 忙碌旋转等待策略。
- 批量发布事件。
- 事件的批量消费。
- 可以为事件处理器线程设置线程亲和性。
- 设置每个事件处理器线程的线程名称。
设计选择
库中的所有内容都与低延迟有关,这严重影响了库中的所有选择。例如,您无法分配事件并将其移动到环形缓冲区中。相反,事件在启动时分配,以确保它们位于内存中,从而提高缓存一致性。但是,您仍然可以在堆上分配结构并将所有权转移到环形缓冲区上事件中的字段。只要您意识到这会增加延迟,因为结构由一个线程分配并由另一个线程删除。因此,分配器中会发生同步。
动态调度也没有用处——一切都是单态的。
Disruptor 和 Crossbeam
Disruptor 和 Crossbeam 库之间显然存在差异。但这并不是因为 Crossbeam 库不是一款出色的软件。它是一款出色的软件。
Disruptor 以 CPU 和内存资源换取更低的延迟和更高的吞吐量,这就是它能够实现这些结果的原因。
如果您可以发布批量事件,Disruptor 也会表现出色,如基准测试中所示,突发事件为 10 和 100 个。
随着突发大小的增加,这两个库都得到了很大的改进,但 Disruptor 的性能对于突发之间的暂停更具弹性,这是设计目标之一。
还有多个其他 Rust 项目模仿 LMAX Disruptor 库:
本库支持的一个关键特性是来自不同线程的多个生产者,而上述两个库均不支持(在撰写本文时)。Tokio 默认专注于高吞吐量,因为他们主要使用yield_now退避策略。它应该适用于大多数应用程序。
对于延迟敏感的应用程序,它往往具有不同的目的,主要是以 CPU 和 RAM 的使用率为代价来获得更高的低延迟(首先)和更高的吞吐量。disruptor 更注重低延迟。而且成本非常高:核心利用率 100%。如果你可以通过提高速度来赚钱,比如在电子交易中,那么这是一个不错的选择。
这些库更注重热路径/缓存一致性,并允许单 CPU 处理(无缓存一致性问题/锁争用)。这就是性能的来源,在原始 LMAX 论文中称为“机械同情”。
最初,计算机价格昂贵,许多用户希望共享一个系统,因此很多操作系统都考虑到了这一点,LMAX 颠覆了这一点,计算机价格低廉,你希望计算机尽可能快地完成一件事,而这不适合围绕完全相反的想法设计的现代操作系统。
- 这也是为什么裸机在实践中比虚拟机快很多倍的原因,因为你不会与一堆污染缓存的其他程序共享别人的计算机。