【问题标题】:NServiceBus Pub/Sub Distributor/Worker Scenario Too SlowNServiceBus Pub/Sub Distributor/Worker 场景太慢
【发布时间】:2013-07-24 18:16:33
【问题描述】:

我正在研究 NServiceBus v4.x 的概念验证实现。

现在我有两个订阅者和一个发布者。

发布者每秒可以发布超过 500 条消息。它运行良好。

订阅者 A 在没有分销商/工人的情况下运行。这是一个单一的进程。

订阅者 B 与一个为 N 名工人供电的分销商一起运行。

在我的测试中,我遇到了一个创建和发布 100,000 条消息的端点。我在离线订阅者的情况下发布。

订阅者 A 每秒处理稳定的 100 条消息。 拥有 2 个以上工作人员(2、3 或 4 个结果相同)的订阅者 B 难以在所有工作人员中达到每秒 50 条消息总数。

在我的场景中,工人(我将每个工人增加到 40 个线程)似乎正在等待分发者给他们工作。

我是否遗漏了一些可能导致分配器受到限制的东西?所有总线都运行无限制的开发许可证。

系统信息: 英特尔酷睿 i5 M520 @ 2.40 GHz 8 GB 内存 SSD硬盘

更新 08/06/2013:我已将系统部署到一组服务器。我正在经历同样的结果。我添加的每台带有工作器的服务器都会降低订阅者的性能。

订阅者 B 在一台服务器上有一个分发服务器,另外还有两台用于工作人员的服务器。使用订阅者 B 和一台具有活跃工作人员的服务器,我每秒遇到约 80 条消息/事件。在额外的物理机器上添加另一个工作人员会将其减少到每秒约 50 条消息。此外,这些是“虚拟消息”。除了通过 log4net 记录消息之外,处理程序中实际上没有发生任何逻辑。关闭日志不会提高性能。

建议?

【问题讨论】:

    标签: nservicebus nservicebus4


    【解决方案1】:

    如果您在一台服务器上使用 NServiceBus 主/工作节点向外扩展,那么尝试衡量性能是没有意义的。具有多个线程的一个进程总是比同一台机器上的分配器和多个工作节点做得更好,因为分配器将成为瓶颈,而所有事物都在竞争相同的计算资源。

    如果将工作人员转移到不同的服务器上,情况就完全不同了。如果这是服务器上唯一发生的事情,分发器在分发消息方面非常有效。

    尝试使用多台服务器,看看会发生什么。

    【讨论】:

    • 完成对 POC 的一些添加(例如 Sagas),然后我将使用我们 IT 部门的服务器对其进行测试。
    • 仍在设置服务器环境。快完成了。下周初应该会有更新。
    • 我已经完成了服务器的设置并更新了我的原始帖子的详细信息。
    • 您应该监控所有服务器上的网络带宽、磁盘 io、磁盘队列长度、cpu 使用情况。您在服务器之间获得什么样的网络吞吐量?他们在私人交换机上吗?在一个体面的网络中,您应该能够获得至少 100MB/s 以上的速度。你在windows中使用写缓存吗?您是否启用了驱动器加密?如果您使用事务处理所有内容,那么由于您创建的工作人员数量,您会遇到锁定问题。你能分享你正在执行的测试的代码吗?
    • 你如何写这 100.000 条消息?在单独的交易中还是在一笔交易中?编写 100.000 条单独的事务消息已经花费了相当长的时间。
    【解决方案2】:

    您可以通过添加一些睡眠时间(例如 5 秒)来模拟实际处理,而不是使用什么都不做的虚拟处理程序。然后比较一下有订阅者和通过经销商的结果?

    横向扩展(有或没有分配器)仅适用于由单台机器完成的工作需要时间并因此需要更多计算资源的情况。 为了帮助解决这个问题,请监视端点上的 CriticalTime 性能计数器,并在需要时添加分发器。 无需更改代码,只需在分发服务器和工作人员配置文件中启动相同的端点,即可在需要时轻松使用分发服务器进行扩展。

    【讨论】:

    • 我已经这样做了。我有两条消息“FastEvent”和“SlowEvent”。慢事件的 Thread.Sleep 为 2 秒。我将对此进行横向扩展测试。
    • 抱歉,SlowEvent 的处理程序有一个 Thread.Sleep。这些消息只是 POCO。
    • 好的。更重要的是,将分发器视为在/接近耗尽机器上的计算资源之后扩展的一种手段。干杯。
    • 通过增加分发器和工作器上的线程,我几乎可以将使用单个分发器/工作器的设置的吞吐量提高一倍。这两个盒子仍然没有征税。我将继续前进,看看收益递减点从哪里开始。谢谢。
    【解决方案3】:

    整个链条都是事务性的。你为此付出了沉重的代价。当您没有非常快速的磁盘存储并通过缓存写入来加速事务写入时,增加跨机器的工作负载实际上不会提高性能。

    当您将 poc 扩展到多台服务器时,只需尝试将消息标记为“Express”,它不会在队列中进行事务性写入,并在总线实例上禁用 MSDTC,以查看没有事务的情况下可能有什么样的性能。除非您知道这不是强制性的,或者当您拥有不需要 DTC 的架构时,这不是真正可用于生产的。

    【讨论】:

    • 周五我将在模拟生产环境中跨三台服务器进行测试。当我发现更多时,我会更新这个线程。我也会尝试你所说的,看看它是如何影响它的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多