2

在收听了最近的 azure 播客(尤其是关于在 azure 上构建低延迟金融系统的播客)并阅读了有关 Service Fabric 的所有炒作后,我决定尝试更改“分布式计算代码示例 Monte Carlo 模拟”模式以满足我的需要。

我的场景是:具有给定起始状态的一个请求使用基于蒙特卡罗的简单(计算方式)模型运行 10k 完整运动比赛模拟。

我的第一次尝试是:

  • 1 * 有状态的“处理器”Actor,接收匹配的开始状态并将其转发给 10k + 任务 Actor,以及相关的聚合器 ActorId

    • 10K+ * 运行 1 次模拟并将结果传递给其聚合器 Actor 的无状态“任务”Actor。模拟时间很短(~2ms)

    • 100 * 有状态的“聚合器”Actor,聚合接收到的模拟并传递给终结器 Actor

    • 1 * 'Finaliser' 计算最终结果的 Actor

只需使用 Tasks 在我的开发机器上运行上述内容需要 < 100 毫秒,但上述设置(作为本地集群在开发机器上运行)需要 50 秒甚至更多!

在调试了一个潜在原因后,我发现处理器 Actor 发送初始任务所需的时间,所以我想知道调用 Service Fabric 有什么样的开销(我猜各种命名服务调用正在发生当我调用演员的方法时)以及缓慢是否可能是由于这个和我的任务数量造成的?

为了消除其他可能性,我做了以下事情,发现总时间只有很小的差异:

  • 使所有参与者无状态,以确保状态管理不会增加开销。
  • 在处理器中创建所有 ActorProxies 并存储它们的引用以供将来调用以确保 Actor 激活不会引起问题。

有没有人对从这里去哪里有任何建议,或者有没有人试图实现类似的东西?

谢谢,亚历克斯

4

1 回答 1

1

我会将此作为评论发布,但我还没有足够的声誉!如果您在 Service Fabric 的文档中引用此页面,请查看文章下方的评论,尤其是“tom”在 2015 年 6 月左右的某个时候开始的评论线索。他在使用有状态的Actor时遇到了糟糕的性能(每秒约 20 次操作) ,这似乎被认为是未来改进的一个领域。他们强调在非变异方法上使用只读属性来显着提高性能。Abhishek Ram 还包括一些注释和指向相关性能计数器信息的链接,这些信息可能有助于排除故障。

您注意到您尝试使用对性能影响很小的无状态演员。我将进一步指出评论线索,其中另一个用户报告使用只读方法在单个参与者上每秒实现 2k+ 操作,我希望其执行类似于无状态参与者方法。也许可以将来自性能计数器的信息与此进行比较,以查看您的性能与评论中的一些琐碎示例的匹配程度。

于 2015-11-30T19:14:47.727 回答