2012-05-13 52 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,它是一個閉包。由於不需要它,我只需定義一個方法。不知道這是否是原因,但肯定是造成內存泄漏的一個可能原因。