2012-05-13 18 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

タイムアウトクラスにラムダがあります。これはクロージャです。それを必要としないので、代わりにメソッドを定義するだけです。これが原因であるかどうかは不明ですが、確かにメモリリークの原因になります。

関連する問題