私はので、私はいくつかの機能を追加することができrack-timeout gemをフォークしてきました - つまり、タイムアウトの事件をキャッチしてログインし、503ミドルウェアがメモリをリークしているのはなぜですか?
Here's my forkを送信します。
Here's the Rack app/middleware in my fork。
動作は期待どおりです。しかし、配備してから、私のアプリのメモリ占有量は増加し、それを再起動するまで着実に増加しています。それが成長している間、その行動は正しいものであり、その性能は一見正常です。
私が最初に気づいたとき、リクエストがうまくいかず、スレッド/メモリがぶら下がっていたからです。この実験の結果、this patchになりました。確かに、私のローカルテストでは、このパッチメモリがなくても、アプリケーションが(意図的に)タイムアウトしたときに着実に増加し、パッチがあればメモリは低く抑えられます。
私はこの問題を解決したと考えました。しかし、私はしませんでした。私の制作アプリのメモリはまだまだ増え続けています。 (私はプロダクションモードでローカルで自分のアプリをテストしようとはしていない - それを次に行う)。
私のRackアプリケーションでメモリリークを引き起こす原因は何ですか?
余分なスレッドがなぜ ':: Timeout.timeout(self.class.time、Rack :: Timeout :: AppTimeout){@ app.call(env)}'にならないのでしょうか。生産モードでテストする価値のあるコードリロードでは、メモリリークをマスクすることができます。 –
このラッパースレッドがないと、Timeoutがその例外を発生させると、例外はミドルウェアではなくスタックで処理されます。これはTomeoutの実装のためです。 –