MSMQ读取队列速度慢

3
我正在使用一个基于MSMQ的开源.Net库。大约一两周后,服务变慢了(没有确切的时间,只是大致猜测)。看起来发生的情况是,来自MSMQ的消息每隔10秒才被读取一次。通常,它们会立即被读取。所以它们将在T+10秒、T+20秒、T+30秒等时刻被读取,而不管消息何时发送(即有时需要3秒才能读取到消息,有时需要9秒)。
目前我使其恢复正常的方法就是简单地删除并重新创建队列。那么问题是,什么会在MSMQ队列中积累导致这种减速?当减速发生时,队列中没有消息。是否有任何高级的MSMQ分析工具可以更深入地查看队列(而不是计算机管理)?
哦,我忘了提到,写入消息到队列仍然似乎是瞬间完成的。只是读取消息显示出这种行为。
编辑:跟进问题@here,该问题更详细、更专注。

MSMQ 进程的内存大小限制是多少? - Jan Jongboom
我不确定你的意思是什么?在哪里可以查看MSMQ的内存限制? - mike
你确定问题出在 MSMQ 上而不是你正在使用的开源库吗?你已经跨越实际从 MSMQ 中读取数据的代码并确认延迟发生在那里了吗? - dso
有可能是C#的问题,但从修复方式来看,它似乎与MSMQ有关。我想,如果这是C#的问题,删除/重新创建队列就无法解决它。不幸的是,我对MSMQ或库的了解不足以全面调查此问题,但没有其他人使用该库遇到此问题,这也说明了MSMQ(或者特别是我的设置)的问题。如果我成功解决了这个问题,我会发布解决方案! - mike
请参考https://dev59.com/wXI-5IYBdhLWcg3wj5FG,以获取更详细和准确的问题版本,因为我相信我已经相当缩小了问题发生的范围。 - mike
1个回答

2

我已经有一段时间没有做MSMQ相关的事情了,所以请容忍我的老年人记忆。 一些问题浮现在脑海中:

日志队列是否处于活动状态?这与队列绑定,如果队列被删除,我相信(不要引用我)那么日志将从空开始...

队列上是否有清除过程?是否为事务性队列?

是否应用了所有当前服务包?我似乎记得过去有一个服务包修复了这个问题。它可能是依赖于平台的,但您没有列出您的平台。 我相信有几个类似的服务包。

您的磁盘空间如何?您是否遇到磁盘空间问题或碎片化的磁盘问题?文件(如果我没记错)存储在windows\system32\msmq下。 如果没有足够大小的块,则可能会变慢 - 通常在存储/接收消息时,不确定读取。

这些是公共还是私有队列?

性能监视器对分页池等有何说法?我相信每条消息大约是70-80字节。

编辑1:

从MSDN文档档案中得知: “私有队列在本地计算机上注册,而不是在目录服务中注册,且无法通过在远程计算机上运行的消息队列应用程序获取其属性。消息队列通过将每个队列的描述存储在本地队列存储(LQS)文件夹中的单独文件中,在本地计算机上注册私有队列。”
因此,如果目录服务出现故障,则公共队列不可用。另一方面,私有队列存储在本地文件系统中。
为了避免队列的磁盘交换,这台机器应该有很多内存。老实说,我从来没有尝试在Windows XP上运行MSMQ,因为性能问题 - 我们总是在一个具有大量内存的专用服务器上执行它,但是,我们正在处理大量的队列项,每个队列项都很大。(许多千个,接近每个的大小极限)
编辑2:文件系统和空文件:
默认情况下,空消息文件每六小时删除一次。可以通过在注册表中设置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ\Parameters下的MessageCleanupInterval REG_DWORD值来控制此时间间隔。应用程序不应该无谓地长时间保持游标打开状态。游标可能指向已经接收(并从文件中删除)的消息。这些指针会阻止空文件的清理和删除。

注意:为了避免碎片问题,您应该在运行此操作的磁盘上有足够的可用空间。您可以尝试缩短这6小时的时间间隔,以查看是否有所帮助,这样就不必跟踪空文件。

请尽量确保机器上没有其他活动会导致驱动器碎片化,例如浏览互联网。

在公共队列上,有时会延长时间以避免昂贵的Active Directory交互费用。您需要在消息队列会话的两端添加此注册表值。否则,具有最小值的计算机将会过早地停止会话。添加此具有大值的注册表值的常见原因是保持会话活动并避免创建消息队列会话的开销。在您的情况下,您可能需要缩短该值以帮助文件系统管理。(这是一个需要慎重考虑的难题)。
至于热修复: (可能还有其他热修复,但我看不到与您的问题相关的) http://support.microsoft.com/kb/304212中描述的MSMQ 1.0热修复。 此热修复的原因是Windows XP消息队列3.0独立客户端构建为强大的RPC客户端。如果没有此热修复程序,则从Windows XP消息队列3.0独立客户端到MQLocateNext的调用将失败。
RPC热修复程序的说明可参见http://support.microsoft.com/kb/823980。此热修复程序需要启用在运行Windows XP的客户端上进行审计。还需要此热修复程序才能使运行Windows 2000的客户端完成设置。
一个想法:您的内存状态问题在性能监视器中显示什么?是否有大量的磁盘交换?

请原谅我的知识匮乏,因为我不是MSMQ专家,只是通过这个第三方库来使用它。
  • 日志已禁用,没有日志消息
  • 如果您的意思是清除消息?队列中没有消息,但仍然出现了减速。它们是事务性队列。
  • 我很确定我的计算机已经打了补丁。有特定的MSMQ补丁可供下载吗?计算机是Win. XP
  • 有足够的磁盘空间,碎片可能是一个问题,但我怀疑
  • 私人的
  • 能解释一下吗?
- mike
抱歉,上次的留言格式不好... 我也找到了一个叫做TMQ的工具,似乎可以进行一些额外的分析。下次出现减速问题时,我会进一步尝试调试。 - mike
是的,这里有一个链接,指向微软的一个页面,详细介绍了关于性能、内存、管理等方面的很多内容。 http://msdn.microsoft.com/en-us/library/ms811056.aspx更多关于消息大小、数量等方面的细节可能会很有用,以及对存储库所在的文件系统进行检查。 - Mark Schultheiss
只是提醒一下,您可能需要花费数天时间进行繁琐的 MSMQ 检查和诊断,观察不同的模式并隔离问题。这里有很多因素需要考虑。 - Mark Schultheiss
感謝您提供詳盡的回答。針對編輯1,我不認為這是記憶體問題,因為當佇列為空時,問題還是會發生。針對編輯2,我會檢查磁碟碎片情況。目前,我只能等待再次發生問題,以便嘗試偵測任何異常情況。 - mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接