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

Niv*_*Niv 4 msmq nservicebus3

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

.IsTransactional(true)
.IsolationLevel(IsolationLevel.ReadCommitted)
.MsmqTransport()
.RunTimeoutManager()
.UseInMemoryTimeoutPersister()
.MsmqSubscriptionStorage()
.DisableRavenInstall()
.JsonSerializer()
Run Code Online (Sandbox Code Playgroud)

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

关于为什么MSMQ会使用这么多内存并且需要很长时间来发布它的任何想法?谢谢堆.

Joh*_*ell 7

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

强制MSMQ清理其存储文件