7

我目前正在尝试在 Akka.NET(java/scala 演员模型框架的端口)的消息调度程序中找到瓶颈对于那些感兴趣的人,可以在这里找到:https ://github.com/akkadotnet/akka.net

我们似乎可以扩展到 8 个内核,到目前为止一切都很好。然而,当在更大的机器上运行时,一切最终都会崩溃。我们已经在 16 核机器上对此进行了测试,它可以很好地扩展到某个点,然后突然间,消息吞吐量减半。

此图像是在我的笔记本电脑上进行分析时 Akka.NET 分析 查看:http: //i.stack.imgur.com/DxboR.png完整图像

. 瓶颈是 Task.Factory.StartNew,还是 ConcurrentQueue.Enqueue?我不确定我是否正确阅读了这些数字。

以下是我们的消息调度程序和邮箱如何工作的简要说明:

将消息发布到邮箱后,邮箱会检查它当前是否正在处理消息。如果它正在处理消息,它只是让当前正在运行的 Task 使用新消息。

所以本质上,我们将消息发布到 ConcurrentQueue,当前邮箱运行会找到它。

如果在发布消息时邮箱当前处于空闲状态,那么我们使用Task.Factory.StartNew(mailboxAction).

为了确保特定邮箱在任何给定时间只有一个任务在运行,我们使用联锁检查来查看邮箱是忙碌还是空闲。互锁检查有效,经过广泛测试,因此我们知道我们不会为同一个邮箱启动多个任务。

有什么想法会导致 16 核机器上的吞吐量完全中断吗?同样的效果不会发生在较小的机器上,当它们无法再扩展时,它们会在最大吞吐量下保持稳定。

我在 16 核机器上验证过的一件事是,邮箱似乎处理得太快,耗尽了参与者消息队列中的所有消息,一旦有新消息到达,这将导致邮箱的新调度。也就是说,消费者比生产者快。

4

0 回答 0