我正在使用一个开源.Net库,它使用下面的MSMQ。大约一周或两周后,服务速度变慢(不是完全定时但一般猜测)。似乎正在发生的事情是来自MSMQ的消息只是每10秒读取一次。通常,它们会立即被阅读。因此,它们将在T + 10秒,T + 20秒,T + 30秒等时读取,与发送消息的时间无关(即,有时需要3秒才能读取消息,其他时间为9秒)。
我恢复正常的当前方式就是删除&重建队列。所以问题是,在MSMQ队列中可以构建什么来导致这种减速?发生减速时,队列中没有消息。是否有任何先进的MSMQ分析工具可以让您更深入地了解队列(而不是计算机管理)?
哦,我忘了提及,将消息写入队列似乎仍然是即时的。它只是阅读显示此行为的消息。
编辑:跟进问题@ here,这个问题更加详细,更集中。
答案 0 :(得分: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的调用将失败。
http://support.microsoft.com/kb/823980中描述了RPC修补程序。 需要此修补程序才能在运行Windows XP的客户端上启用审核。此修补程序也是使运行Windows 2000的客户端能够完成安装程序所必需的。
一想法:性能监视器对您的内存状态问题有何评价?那里有很多磁盘交换吗?