2012-05-13 41 views
3

我已经分叉的rack-timeout gem,所以我可以添加一些功能 - 即,捕超时的事件,记录他们,并发送503我的中间件为什么会泄漏内存?

Here's my fork

Here's the Rack app/middleware in my fork

行为与预期的一样。然而,自部署以来,我的应用程序的内存占用量不断增长并且稳步增长,直到我必须重新启动它为止。虽然它在增长,但它的行为是正确的,它的表现看起来很正常。

当我第一次注意到这一点时,我认为这可能是因为在请求消失的情况下,一些线程/内存一直处于悬挂状态。这一系列的实验导致了this patch。事实上,在我的本地测试中,如果没有这个补丁程序,当应用程序受到(有意)超时请求的攻击时内存不断增长,并且补丁程序的内存保持低位并正常。

所以,我想我解决了这个问题。但我没有 - 我的产品应用程序的内存仍然在不断增长。 (我没有尝试在生产模式下本地测试我的应用程序 - 我将在下一步做)。

什么可能导致我的Rack应用程序内存泄漏?

+0

为什么多余的线程 - 为什么不是':: Timeout.timeout(self.class.time,Rack :: Timeout :: AppTimeout){@ app.call(env)}'。绝对值得在生产模式下进行测试 - 代码重新加载可以掩盖内存泄漏 –

+0

,因为如果没有该包装线程,当Timeout引发异常时,异常由中间件在堆栈中而不是在我的堆栈中处理。这是因为Tomeout的实施。 –

回答

0

您的Timeout类中有一个lambda,它是一个闭包。由于不需要它,我只需定义一个方法。不知道这是否是原因,但肯定是造成内存泄漏的一个可能原因。