我已经有一段时间没有做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的客户端完成设置。
一个想法:您的内存状态问题在性能监视器中显示什么?是否有大量的磁盘交换?