我已经fork了rack-timeout gem,以便添加一些功能--即捕获超时事件、记录它们并发送503。
这是我的fork。
这是我的fork中的Rack应用程序/中间件。
行为符合预期。然而,自从部署以来,我的应用程序的内存占用不断增长,直到我不得不重新启动它。在它增长的过程中,它的行为是正确的,性能似乎也很正常。
当我第一次注意到这个问题时,我认为可能是因为在请求未成功的情况下,某些线程/内存仍然挂起导致的。经过实验后,这种思路得出了this patch。事实上,在我的本地测试中,如果应用程序受到(故意)超时的请求,没有此补丁,内存会逐渐增长,而有了此补丁,内存保持在正常水平。
所以,我以为自己解决了问题。但实际上并没有 —— 我的生产应用程序中的内存仍然持续增长。(我还没有尝试在生产模式下本地测试我的应用程序——下一步我会这么做)。
什么可能导致我的Rack应用程序内存泄漏?
::Timeout.timeout(self.class.time, Rack::Timeout::AppTimeout) {@app.call(env)}
。在生产模式下进行测试绝对是值得的 - 代码重新加载可能会掩盖内存泄漏问题。 - Frederick Cheung