【问题标题】:MSMQ slow queue readingMSMQ 慢队列读取
【发布时间】:2010-12-07 22:38:55
【问题描述】:

我正在使用一个在下面使用 MSMQ 的开源 .Net 库。大约一两周后,服务速度变慢(时间不准确,但一般猜测)。似乎正在发生的是来自 MSMQ 的消息每 10 秒仅被读取一次。通常,它们会立即被读取。因此,它们将在 T+10 秒、T+20 秒、T+30 秒等时被读取,与消息发送时间无关(即,有时需要 3 秒才能读取消息,有时需要 9 秒)。

我现在恢复正常的方法是简单地删除和重新创建队列。所以问题是,在 MSMQ 队列中建立什么会导致这种速度变慢?发生减速时,队列中没有消息。是否有任何高级 MSMQ 分析工具可以让您更深入地了解队列(相对于计算机管理)?

哦,我忘了说,将消息写入队列似乎仍然是即时的。它只是阅读显示此行为的消息。

编辑:跟进问题@here,更详细、更集中。

【问题讨论】:

  • MSMQ 进程的内存大小是多少?
  • 我不确定你的意思?在哪里可以查看 MSMQ 的内存限制?
  • 您确定问题出在 MSMQ 而不是您使用的开源库吗?您是否检查过实际从 MSMQ 读取的代码并确认这是延迟所在?
  • 这可能是 C# 中的一个问题,但在我看来它与 MSMQ 相关,因为它是固定的。我想如果这是一个 C# 问题,删除/重新创建队列将无法解决它。不幸的是,我对 MSMQ 或库的了解不够充分,无法对此进行全面调查,但没有其他人在使用指向 MSMQ 的库时遇到此问题(或者特别是我的设置)。如果我能解决这个问题,我会发布解决方案!
  • 请参阅stackoverflow.com/questions/1794307/… 了解更详细的问题版本,因为我相信我已经缩小了问题发生的范围。

标签: queue msmq performance


【解决方案1】:

我已经有一段时间没有做 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 的调用将失败。

http://support.microsoft.com/kb/823980 中描述了 RPC 修补程序。 需要此修补程序才能在运行 Windows XP 的客户端上启用审核。要使运行 Windows 2000 的客户端能够完成安装,还需要此修补程序。

一个想法:性能监视器对您的内存状态问题有何看法?那里有很多磁盘交换吗?

【讨论】:

  • 请原谅我缺乏知识,因为我不是 MSMQ 专家,只能通过这个 3rd 方库知道/使用它。 - 日志被禁用并且没有日志消息 - 如果通过清除您的意思是消息被删除?队列中有 0 条消息,并且仍然出现减速。它们是事务队列。 - 我很确定我的电脑打了补丁。是否有特定的 MSMQ 补丁可供下载?电脑是赢。 XP - 大量磁盘空间,碎片可能是一个问题,但我对此表示怀疑 - 私人 - 需要解释一下吗?
  • 抱歉,最后一条评论的格式不正确...我还发现了一个名为 TMQ 的工具,它似乎可以进行一些额外的分析。当再次出现减速时,我会尝试进一步调试。
  • 是的,这是一个 MS 页面的链接,详细介绍了有关性能、内存、管理方式等方面的许多内容。msdn.microsoft.com/en-us/library/ms811056.aspx 有关消息大小、数量等的更多详细信息可能有用,以及检查维护存储的文件系统。
  • 仅供参考,您可以用 MSMQ 观察不同的模式并隔离问题,花费数天时间进行繁琐的检查和诊断。这里有很多因素需要考虑。
  • 感谢您的详尽回答。 RE:编辑 1,我认为这不是内存问题,因为当队列为空时会出现问题。 RE:编辑 2,我将检查磁盘碎片。目前我只是在等待它再次发生,以便尝试检测任何异常情况。
猜你喜欢
  • 2012-10-03
  • 2010-09-21
  • 1970-01-01
  • 2011-10-22
  • 2014-04-07
  • 2011-09-23
  • 2013-12-31
  • 2011-09-24
  • 2013-01-27
相关资源
最近更新 更多