長いポーリングアクションを実行するようにAsyncController
が設定されています。これはうまくいきますが、同僚は新しい接続ごとに増加するように見えるサーバー上のメモリリークに気づいています。MVC 4各接続のIISメモリリーク
私はこのページから何千回もリクエストする小さなアプリケーションを作成しました。私はIISプロセスのメモリ使用量を監視しています。各接続はメモリ使用量を増加させますが、クライアントの接続が切断されても、すべての使用率が低下しません。
public class WaitController : Controller
{
public JsonResult Member(string oauth_token, int service_id, bool busy = false)
{
return Json(new
{
ready = false,
}, JsonRequestBehavior.AllowGet);
}
}
これでは、ない同じくらいありますがメモリ使用量:
は、さらなる調査の後、私はこれが、何もしない標準Controller
と私のAsyncController
を交換する際に、これはまだでも起こることがわかりました、その行動はまったく同じように見える。
私はメモリプロファイラを実行して10,000の接続の違いを表示しましたが、そこにはほとんど何もありません。ほとんどのメモリはExpiresEntry[]
のインスタンスによってSystem.Web.Caching
またはSystem.Runtime.Caching
に取り込まれていますが、これらはIISワーカープロセスのメモリ増加と比較して何もありません。
私の質問はです。IISはこれを設計していますか?おそらく、これは接続スレッド用に割り当てられていたでしょう。これはIIS、ASP.NET、またはMVC 4のバグですか?
MVC 4のWebAPI機能を柔軟に使用できるようにすることが決定されました。これは、柔軟性があり、保守性が高く、将来の保証が得られ、AJAX経由でアクセスされるためです。 MVC 4でもWebサイトを構築しているので、開発の観点からも意味をなさないように思えました。
しかし、私たちは(今後)何千ものクライアントを接続する必要があるため、これをシステムアーキテクチャの重要な問題として提起しています。彼は代わりにWCFを使うことを提案している。だから、ボーナスの質問 - これらの問題を解決するWCFを使用しますか?
メモリがリークしていますか?それはそれを放棄するための十分な圧力がないので、それを保持している可能性がありますか?接続テストを継続して実行すると、サーバーが最終的にメモリ不足になることを確認しましたか? – Pete
@Peteそれは減速を開始します。私はそれが実際にメモリ不足を見たことはないが、全体のアプリケーションプールは徐々にそれが使用不能になるまで遅くなる。これは、アプリケーションプールを再起動することによって解決されます。割り当てられたメモリをあきらめるためにIISに「プレッシャー」が必要ですか?私が考えている悪い性能は、各接続が処理されるために待ち行列で待っているだけかもしれません。 – Connell