为什么我的中间件会内存泄漏?

3
我已经fork了rack-timeout gem,以便添加一些功能--即捕获超时事件、记录它们并发送503。 这是我的fork。 这是我的fork中的Rack应用程序/中间件。 行为符合预期。然而,自从部署以来,我的应用程序的内存占用不断增长,直到我不得不重新启动它。在它增长的过程中,它的行为是正确的,性能似乎也很正常。

当我第一次注意到这个问题时,我认为可能是因为在请求未成功的情况下,某些线程/内存仍然挂起导致的。经过实验后,这种思路得出了this patch。事实上,在我的本地测试中,如果应用程序受到(故意)超时的请求,没有此补丁,内存会逐渐增长,而有了此补丁,内存保持在正常水平。

所以,我以为自己解决了问题。但实际上并没有 —— 我的生产应用程序中的内存仍然持续增长。(我还没有尝试在生产模式下本地测试我的应用程序——下一步我会这么做)。

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


为什么要多开一个线程 - 为什么不用 ::Timeout.timeout(self.class.time, Rack::Timeout::AppTimeout) {@app.call(env)}。在生产模式下进行测试绝对是值得的 - 代码重新加载可能会掩盖内存泄漏问题。 - Frederick Cheung
因为没有那个封装线程,当超时引发异常时,该异常将由堆栈中的中间件处理而不是我的代码。这是由于Timeout的实现方式导致的。 - John Bachir
1个回答

0
你的Timeout类中有一个lambda表达式,它是一个闭包。既然没有必要使用它,我建议你定义一个方法来代替。虽然不确定这是否是问题的原因,但它很可能导致内存泄漏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接