【问题标题】:Which is a better architecture? Multiple SPSC queues or a one MPSC queue?哪个架构更好?多个 SPSC 队列还是一个 MPSC 队列?
【发布时间】:2018-03-20 12:37:23
【问题描述】:

我正在使用 C++ 编写 HFT 应用程序,因此低延迟非常重要。我使用无锁队列实现。

我的系统中主要有2个生产者线程,Producer1和Producer2,还有1个消费者线程Consumer1。

Producer1 产生 EventA 和 EventB
Producer2 产生 EventA

我看到有两个选项:
选项 1 - MPSC 队列
Producer1 将 EventA 推送到 Q1
Producer1 将 EventB 推送到 Q1
Producer2 将 EventA 推送到 Q1
Consumer1 线程循环消费 Q1。

选项 2 - 多个 SPSC 队列和单个消费者
Producer1 将 EventA 推送到 Q1
Producer1 将 EventB 推送到 Q2
Producer2 将 EventA 推送到 Q3 Consumer1线程循环消费Q1、Q2、Q3。

希望清楚...

在性能方面,您认为哪个选项更好?

提前谢谢..

【问题讨论】:

  • 没有一般性答案。您需要测试程序中的代表性用例、运行它的每组硬件等。即使性能存在差异,这些选项也可能导致事件以不同的顺序被消耗——这取决于消费者的行为会影响行为。
  • 您可以在不使用任何原子操作的情况下实现 SPSC 队列(仅使用内存屏障)。所以 2 个 SPSC 队列(P1->C1 和 P2->C1)可能是一个简单/理想的解决方案。但是,P1 和 P2 的生产率是多少? EventA 和 EventB 的大小是多少?他们是汇集的吗?如果是,它们是从同一个池中汇集的吗?可能还有其他我忘记提及的问题(NUMA?)。最好对这两种方法进行测试和基准测试!

标签: c++ multithreading low-latency


【解决方案1】:

就性能而言,选项 2 更好。

原因是,您可以使用无锁循环队列,生产者不会与消费者发生争用。由于所有生产者现在都在写入单独的队列。根本没有争论。 将此与选项 1 进行比较,其中所有生产者都必须竞争锁定 q1。

除了性能之外,事件处理的顺序是否重要?我想不是。如果是,那么您需要在选择解决方案时考虑这些因素

【讨论】:

    猜你喜欢
    • 2017-10-08
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2019-07-04
    相关资源
    最近更新 更多