queue - MSMQ慢队列读取

标签 queue msmq performance

我正在使用一个在下面使用MSMQ的开源.Net库。大约一周或两周后,服务速度会降低(不是准确计时,而是一般猜测)。似乎正在发生的情况是,每10秒仅准确读取一次来自MSMQ的消息。通常,它们是即时读取的。因此,它们的读取时间为T + 10秒,T + 20秒,T + 30秒等,与发送消息的时间无关(即有时读取消息需要3秒钟,而其他时候需要9秒钟)。

我目前恢复正常的方法只是删除并重新创建队列。因此,问题是,什么会在MSMQ队列中累积以导致这种速度下降?发生减速时,队列中没有消息。是否有任何高级MSMQ分析工具可以让您更深入地了解队列(与计算机管理相对)?

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

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

最佳答案

自从我做MSMQ东西以来已经有一段时间了,所以请耐心地(耐心地)怀念我的旧大脑记忆。
我想到了一些问题:

日记队列是否处于 Activity 状态?这与一个队列相关联,如果删除了该队列,我相信(不要引用我的话)那么日记将从空开始。

队列上是否有清除进程?
这些是交易队列吗?

是否应用了所有当前的Service Pack?我似乎想起了在遥远的过去对此服务包的修复。它可能取决于平台,但您未列出平台。
我相信有几种这种性质的服务包。

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

这些是 public 队列还是 private 队列?

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

编辑1:

从MSDN文档档案中:
“专用队列是在本地计算机上注册的,而不是在目录服务中注册的,并且它们的属性不能由运行在远程计算机上的消息队列应用程序获得。消息队列通过将每个队列的描述存储在单独的文件中,从而在本地注册专用队列。本地计算机上的本地队列存储(LQS)文件夹。”

因此,如果目录服务关闭,则 public 队列不可用。另一方面,专用队列存储在本地文件系统中。

这台机器应该有很多内存,以避免磁盘交换队列。坦率地说,由于性能问题,我从来没有尝试过在Windows XP机器上运行MSMQ-总是让它在带有很多内存的专用服务器机器上执行-但是,那时,我们正在处理大量排队的项目,每个都很大。 (成千上万,每个都接近大小限制)

编辑2:文件系统和空文件:

“默认情况下,默认情况下,每六个小时删除一次空的消息文件。可以通过在HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSMQ \ Parameters下设置MessageCleanupInterval REG_DWORD值来控制此时间间隔。应用程序不应长时间不必要地打开游标时间,游标可能指向已收到(已从文件中删除)的消息,这些指针阻止清除和删除空文件。

注意:您正在运行的磁盘上应该有大量可用空间,以防止碎片问题。您可以尝试减少这6个小时的时间,以查看是否有帮助-从而不必跟踪空白文件。

尝试确保计算机上没有任何其他 Activity 可能使驱动器碎片化,例如浏览Internet。

在 public 队列上,有时会扩展此方法以避免Active Directory交互的开销,该开销可能很昂贵。
您需要在消息队列 session 的两端添加此注册表值。否则,值最小的计算机将过早停止 session 。向此注册表值添加较大值的常见原因是使 session 保持 Activity 状态,并避免创建消息队列 session 的开销。在您的实例中,您可能需要缩短该值以帮助进行文件系统管理。 (这是一个很难的呼吁,坦率地说,需要考虑)。

至于热修复程序:
(可能更多,而并非特定于我所看到的问题)

http://support.microsoft.com/kb/304212中描述了MSMQ 1.0修补程序。
此修补程序的原因是Windows XP Message Queuing 3.0独立客户端被构建为健壮的RPC客户端。没有此修补程序,从Windows XP消息队列3.0独立客户端到MQLocateNext的调用将失败。

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

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

关于queue - MSMQ慢队列读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1587672/

相关文章:

php - Gearman 移除 worker 函数

python - 如何清除 multiprocessing.Queue?

node.js - 使用 Node.js 和 MSMQ 的最佳方式是什么?

c# - Nservicebus 多端点错误

java - 为什么我的迭代器 foreach 循环永远不会进入/执行?

c++ - 为什么双端队列比队列快?

windows - Wix:安装 MSMQ 组件

linux - 下载文件中存储的多个 url

java - 为了循环效率

java - 为什么 Java 使用包含 X 的外部变量的函数比直接使用 X 更快?