5

我有两个使用 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 会使用这么多内存并且需要很长时间才能释放它的任何想法?多谢了。

4

2 回答 2

8

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

强制 MSMQ 清理其存储文件

于 2012-11-20T00:00:20.523 回答
1

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

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 文件
于 2013-05-16T15:02:17.417 回答