在linux环境中,我们遇到了一个空队列占用磁盘空间的场景。
当文件系统变满时,我们的队列管理器意外结束,我们需要清空q文件来恢复队列管理器。
但实际上我们根本没有任何消息在队列中。这显示了一个特定的队列。
为什么磁盘空间放在这里?根本原因是什么?
发布于 2011-07-25 23:54:24
WMQ不会实时收缩队列文件。例如,您的队列中有100条消息,您消费了第一条消息。然后,WMQ不会收缩文件并将所有消息上移一个位置。如果它试图对每条消息执行此操作,您将永远无法获得当前在产品中看到的吞吐量。
实际发生的情况是,WMQ将在处理生命周期的某些点收缩队列文件。在队列变空和队列下的文件缩小之间存在一些延迟,但这种延迟通常很小,以至于无法察觉。
您所描述的事件在理论上可以在一些非常特定的条件下发生,但它将是极其罕见的。事实上,在我从事WMQ工作的15年中,我只看到过几个缩小队列文件的延迟明显的例子。我猜这里实际发生的是你的一个假设或观察是错误的。例如:
队列实际上是空的吗?
实际上是队列文件填满了文件系统吗?
它甚至是MQ吗?
我们经常看到的一个问题是,应用程序将尝试将超过5,000条消息放在一个队列中,并收到QFULL错误。然后,大多数人做的第一件事就是设置MAXDEPTH(999999999),以确保这种情况永远不会再次发生。这样做的问题是QFULL是一个软错误,应用程序可以从中恢复,但填满文件系统是一个硬错误,可能会导致整个QMgr宕机。设置MAXDEPTH(999999999)用可管理的软错误换取致命错误。MQ管理员有责任确保队列上的MAXDEPTH和MAXMSGL被设置为不会填满底层文件系统。在大多数商店中,在所有文件系统上都有额外的监控,以便在它们填满之前发出警报。
总而言之,在大多数情况下,WMQ在缩小队列文件方面做得非常好。特别是,当队列清空时,这是一个自然的同步点,在这个同步点上,文件可以收缩,这通常发生在队列清空后的几秒钟内。您可能遇到了一种罕见的竞争情况,即文件的收缩速度不够快,或者这里发生了一些在您的初始分析中不太明显的事情。在任何情况下,请管理MAXDEPTH和MAXMSGL,使任何队列都无法填满文件系统,并编写代码来处理QFULL条件。
https://stackoverflow.com/questions/6816183
复制相似问题