Configuration 如何为Akka中的不同调度器指定不同的吞吐量值?

Configuration 如何为Akka中的不同调度器指定不同的吞吐量值?,configuration,akka,Configuration,Akka,我的Akka演员系统有许多不同的调度员。在我的application.conf文件中,示例如下所示 market-dispatcher { executor = "thread-pool-executor" type = PinnedDispatcher thread-pool-executor.allow-core-timeout=off } 现在,我想通过为吞吐量指定一个值来进一步配置dispatchers。我已经尝试了显而易见的解决方案 market-dispatcher {

我的Akka演员系统有许多不同的调度员。在我的
application.conf
文件中,示例如下所示

market-dispatcher {
  executor = "thread-pool-executor"
  type = PinnedDispatcher
  thread-pool-executor.allow-core-timeout=off
}
现在,我想通过为吞吐量指定一个值来进一步配置dispatchers。我已经尝试了显而易见的解决方案

market-dispatcher {
  executor = "thread-pool-executor"
  type = PinnedDispatcher
  thread-pool-executor.allow-core-timeout=off
  throughput = 1000
}

…但我没有注意到系统性能有任何明显的不同。是否可以为各个调度器单独配置吞吐量?

是的,您可以配置每个调度器的吞吐量。但是关于您的示例,对于PinnedDispatcher,吞吐量设置被忽略。从文档中:

吞吐量定义了每分钟要处理的最大消息数 线程跳转到下一个参与者之前的参与者

但是,PinnedDispatcher

为每个参与者指定一条独特的线索

因此,线程将永远不会跳转到另一个演员

由于很难理解PinnedDispatcher和设置吞吐量的组合,因此在这种情况下忽略吞吐量设置

关于你的评论:

这意味着最多8个<10个线程可以在进程中的任何一点上取得进展 时间,因此,在任何时间点,使用 PinnedDispatcher将具有空闲线程

我想我不明白你的例子。在我的理解中,线程空闲意味着参与者没有要处理的消息,而不是没有要运行的CPU核心。所有10个都可以是可运行的或空闲的,与内核的数量无关

我试图理解如何控制演员的动作 使用PinnedDispatcher会停止进展,并被迫闲置 在这种情况下

你是说被迫放弃核心?通过使用PinnedDispatcher,您是说您将此决定留给OS调度程序。似乎您希望在处理大量消息后显式地“让出”线程。我认为这是相当不寻常的,并不是阿克卡固有的东西。“自然”屈服点是在处理了大量消息之后,这将适用于其他类型的调度器。
首先,为什么要使用PinnedDispatcher

说得好。但是,假设我有一组10个参与者,使用一个
PinnedDispatcher
运行在一台具有4(8)个物理(逻辑)内核的机器上。这意味着在任何时间点最多可以有8个<10个线程取得进展,因此,在任何时间点,使用
PinnedDispatcher
的两个参与者将有空闲线程。我试图了解如何控制使用
PinnedDispatcher
的参与者停止进展并在这种情况下被迫闲置的时间点。也许这代表了我配置调度器时的一个设计缺陷?我正在使用Scala和Akka构建一个大型市场模拟器。该系统由大量(即100万订单)交易参与者和数量少得多(即1000订单)的市场参与者组成。给定的数量级是我想要构建的系统的上限:我经常对一两个市场和几千名交易员进行模拟。我觉得给我的
MarketActors
专用线程是有意义的,因为每个
MarketActor
都有很多消息要处理,我希望我的市场具有高吞吐量。因此,我使用了
PinnedDispatcher
。我认为使用PinnedDispatcher不会获得更高的吞吐量,它们在优化延迟而不是吞吐量方面更有用。也许你也感兴趣。也许我用错了术语。让我来区分软件线程和硬件线程。在我有4(8)个物理(逻辑)corse的机器上,任何时候只有8个硬件线程可以取得进展。正如您所指出的,可以有任意数量的软件线程,所有这些线程都可能是可运行的或空闲的。特定的软件线程是可运行的还是空闲的取决于相关参与者的邮箱中是否有要处理的消息,并且与内核的数量无关。