使用NServiceBus处理消息时,MSMQ消耗大量内存

时间:2012-11-18 23:15:31

标签: msmq nservicebus3

我有两个使用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会使用这么多内存并花费很长时间来释放它? 谢谢你。

2 个答案:

答案 0 :(得分:7)

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

Forcing MSMQ to clean up its storage files

答案 1 :(得分:1)

关于偶然机会它会对任何人有所帮助 - 这篇由msmq传奇人物撰写的谷歌小组上的帖子记录了如何真正清理存储中的所有信息,这有时是可取的/必要的

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文件