代码之家  ›  专栏  ›  技术社区  ›  mike

msmq慢速队列读取

  •  3
  • mike  · 技术社区  · 15 年前

    我使用的是一个开源.NET库,它下面使用了msmq。大约一到两周后,服务速度会减慢(不是精确计时,而是一般猜测)。似乎每10秒只能读取一次来自msmq的消息。通常情况下,它们会立即被读取。因此,它们将在T+10秒、T+20秒、T+30秒等时间被读取,而与发送消息的时间无关(即有时读取消息需要3秒,而其他时间则需要9秒)。

    现在我恢复正常的方法只是删除和重新创建队列。所以问题是,什么可以在msmq队列中累积,从而导致这种速度减慢?当发生减速时,队列中没有消息。有没有高级的msmq分析工具可以让您更深入地了解队列(而不是计算机管理)?

    哦,我忘了提一下,将消息写入队列仍然是即时的。它只是读取显示这种行为的消息。

    编辑: 后续问题@ here 这是一个更详细和更集中。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Peter Mortensen icecrime    15 年前

    我已经有一段时间没有做过关于msmq的事情了,所以我(要宽容)对我的旧大脑记忆感到厌烦。 我想到了一些问题:

    日志队列是否处于活动状态?这与一个队列相关联,如果队列被删除,我相信(不要引用我的话)日志将从空的开始……

    队列上是否有清除进程? 这些是事务性队列吗?

    是否应用了所有当前的服务包?我似乎记得在遥远的过去,一个服务包上有一个补丁。它可能依赖于平台,但您没有列出您的平台。 我相信有几个这样的服务包。

    您的磁盘空间是什么样的?您是否遇到磁盘空间问题或磁盘碎片问题?文件(如果我记得)存储在windows\system32\msmq下。如果没有所需大小的块,可能会减慢速度——通常在存储/接收消息时,不确定是否读取。

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

    性能监视器对分页池等有什么看法?我相信每封邮件有70-80个字节。

    编辑1:

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

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

    这台机器应该有大量的内存来避免队列的磁盘交换。坦率地说,由于性能问题,我从来没有尝试在Windows XP设备上运行msmq—总是让它在具有大量内存的专用服务器设备上执行—但后来,我们处理的是一大组排队的项目,每个项目的大小都很大。(数千个,每个接近大小限制)

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

    “默认情况下,每六小时删除一次空邮件文件。此时间间隔可以在注册表中通过在hkey_local_machine\software\microsoft\msmq\parameters下设置messagecleanupInterval Reg-dword值来控制。应用程序不应长时间不必要地保持游标打开。光标可能指向已接收(并从文件中删除)的消息。这些指针防止清理和删除空文件。

    注意:您应该在正在运行的磁盘上有大量的可用空间,以防止出现碎片问题。您可以尝试缩短这6小时的时间范围,看看这是否有帮助-所以它不必跟踪空文件。

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

    在公共队列中,有时为了避免 Active Directory 交互可能很昂贵。 您需要在消息队列会话的两端添加此注册表值。否则,具有最小值的计算机将过早停止会话。使用大值添加此注册表值的一个常见原因是保持会话活动,并避免创建消息队列会话的开销。在您的实例中,您可能需要缩短值以帮助文件系统管理。(这是一个很难作出的决定,坦率地说,需要考虑)。

    关于热修复: (可能更多,我看不出具体的问题)

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

    rpc修补程序在 http://support.microsoft.com/kb/823980 . 在运行Windows XP的客户端上启用审核需要此修补程序。此修补程序还要求运行Windows 2000的客户端完成安装。

    一种想法:性能监视器对您的内存状态问题说了什么?那里有很多磁盘交换吗?