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

2024-03-23

我有两个使用 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 使用 4MB 内存块进行存储,这些内存块映射到存储文件夹中的文件。 170,000 条消息,每条 5-10kb 的大小为 0.85-1.7GB,因此您看到分配了如此多的虚拟内存也就不足为奇了。为了减少消息删除或到达时删除和创建文件的开销,存储文件将保留 6 小时。在此期限之后,空文件将被删除。您可以对此进行配置,如我的博客文章中所述:

强制 MSMQ 清理其存储文件 https://learn.microsoft.com/en-us/archive/blogs/johnbreakwell/forcing-msmq-to-clean-up-its-storage-files

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NServiceBus 处理消息时 MSMQ 消耗大量内存 的相关文章

  • Tomcat 8 中的 HTTP/2 支持

    经过一番研究 我很惊讶在 Tomcat 中没有找到任何关于 HTTP 2 支持的资源 8 0 的变更日志表明对 SPDY 的实验性支持 并且 wiki 将 HTTP 2 称为受支持的规范 http wiki apache org tomca

随机推荐