【问题标题】:NServiceBus 100% CPU usage when stopping MSMQ停止 MSMQ 时 NServiceBus 100% CPU 使用率
【发布时间】:2013-01-25 02:13:05
【问题描述】:

我们在 Web 应用程序中使用 NServiceBus,最近发现有时尽管处于连接状态,但仍有一些消息仅位于出站队列中,但从未离开。删除它们的最快解决方案是重新启动 MSMQ 服务。我遇到的一个问题是,当重新启动或停止 MSMQ 服务时,CPU 会跳到 100%。

有没有人遇到过这种情况并找到防止这种高负载的方法。我不喜欢仅仅因为停止服务而中断的想法?我知道的一种方法是使用仅发送模式,但这并不理想。

更新: global.asax 应用程序启动中使用的配置代码:

  IBus bus = Configure
            .With()
            .DefaultBuilder()
            .FileShareDataBus("c:\\storage")
            .XmlSerializer()
            .MsmqTransport()
            .IsTransactional(false)
            .PurgeOnStartup(false)
            .UnicastBus()
            .ImpersonateSender(false)
            .CreateBus()
            .Start(() => Configure.Instance.ForInstallationOn<Windows>().Install());

【问题讨论】:

  • 你用的是什么版本的nsb?
  • 我使用的是 nsb 3.3.0。我还更新了问题以添加配置代码。

标签: nservicebus


【解决方案1】:

我认为您的问题可能与 GitHub 上的问题 Incorrect MSMQ perms cause high CPU in web application 有关,该问题已关闭,但针对尚未发布的 4.0 版本。

问题是 NServiceBus 正在尝试从队列中读取,但没有队列!所以它进入了一个与处理器挂钩的 Check-Error-Retry 的紧密循环。

取消 MSMQ 对于需要它的 Web 服务器来说是一件相当愤怒的事情。如果您需要在生产中执行此操作,我建议将服务器从负载平衡池中取出(我假设/希望您正在使用负载平衡器),然后重新启动 MSMQ,然后重新启动 IIS。如果服务器不处理请求,那么短期的高 CPU 活动应该没什么大不了的。

当 4.0 发布时,它应该解决 CPU 问题,但我仍然建议让服务器停止轮换,否则Bus.Send() 将在 MSMQ 不可用时抛出。

【讨论】:

  • 谢谢。这不是权限,不幸的是,在发布此问题前几周我确实遇到了这个问题,而且我确实花了一些时间来解决这个问题。重新启动或停止 MSMQ 服务从来都不是目的,但这是我们认为应该解决的问题之一,而不是仅仅隐藏在地毯下。很高兴看到有一些东西正在处理它。为此干杯!
猜你喜欢
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多