【问题标题】:MSMQ consuming large amounts of memory when processing messages with NServiceBusMSMQ 在使用 NServiceBus 处理消息时消耗大量内存
【发布时间】:2012-11-06 21:25:31
【问题描述】:

我有两个使用 NserviceBus 的 Windows 服务。一个将消息写入队列,另一个从队列中读取并进行一些处理。所有队列都是事务性的,NserviceBus 端点配置如下。

.IsTransactional(true)
.IsolationLevel(IsolationLevel.ReadCommitted)
.MsmqTransport()
.RunTimeoutManager()
.UseInMemoryTimeoutPersister()
.MsmqSubscriptionStorage()
.DisableRavenInstall()
.JsonSerializer()

问题是当大量消息 (170,000+) 排队时,MSMQ 服务 (mqsvc.exe) 会占用相当多的内存 (1.5 - 2.0 GB) 并且至少在一段时间内不会释放内存5 - 6 小时。平均消息大小约为 5 - 10 KB。似乎您排队的消息越多,它使用的内存就越多。基于 NServiceBus 的 Windows 服务的内存消耗处于完全可接受的范围内(50 - 100 MB),无论处理多少消息都不会增加。

关于为什么 MSMQ 会使用这么多内存并且需要很长时间才能释放它的任何想法? 非常感谢。

【问题讨论】:

    标签: msmq nservicebus3


    【解决方案1】:

    这是完全正常的。 MSMQ 使用 4MB 内存块中的存储,这些内存块映射到 Storage 文件夹中的文件。 170,000 条 5-10kb 的消息是 0.85-1.7GB,因此您看到分配了如此多的虚拟内存也就不足为奇了。为了减少在消息被删除或到达时删除和创建文件的开销,存储文件将保留 6 小时。在此期间之后,将删除空文件。您可以按照我的博文中所述进行配置:

    Forcing MSMQ to clean up its storage files

    【讨论】:

      【解决方案2】:

      它可能会对任何人有所帮助 - msmq 传奇人物 John Breakwell 在 google 群组上的这篇文章记录了如何真正彻底清理存储中的所有消息,这有时是可取/必要的

      https://groups.google.com/d/msg/microsoft.public.msmq.performance/jByfXUwXFw8/i1hVP1WJpJgJ

      我有 8GB 的​​文件,但在任何队列中都没有消息,msmq 服务大约需要 2 个小时才能进入启动状态。清除任何队列都需要 10 分钟,并导致大量内存峰值,然后几天都没有释放,如果有的话。

      如果您遇到这种情况,您可以按照以下步骤操作,而不是重新安装消息队列:

      1. 停止消息队列服务
      2. 转到 MSMQ 存储位置(通常是 C:\Windows\System32\msmq\storage)
      3. 仅删除 P*.MQ、J*.MQ、R*.MQ 和 L*.MQ 文件

      【讨论】:

        猜你喜欢
        • 2016-03-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 2014-01-04
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多