2017-10-29 15 views
0

MVC 5 + Entity Frameworkで書かれたWebアプリケーションがあります。Entity Framework DataContextはIISWorkerプロセスでメモリをアンロードしませんプロセスメモリリーク?

私は、EFデータにアクセスするコントローラへのリクエスト、サーバーメモリがひどく成長し、決して解放されないことに気付きました。

私は300MBのメモリを持つアプリケーションを開始していますが、50個のプロセスがすでに1.5GBのプロセスを要求しているとします。

DBコンテキストが、私はコンテキストが配置され、かつメモリが解放されている期待する。この時点で声明

using (var ctx = new MyEntitiesContext) 
{ 
    var list = ctx.Answers.ToList(); 
    return list; 
} 

//を使用して同封 が、この問題が発生していない、それが起こることはありませんということ以上のものです。

エンティティを追加すると同じです...

助けてください。

答えて

0

コンテキスト自体は多くのメモリを占めないため、using()ブロックを使用している場合は、処分する必要があります。しかし、より大きな問題はエンティティのリストを返すでしょう。サーバーは要求を処理するためにメモリを割り当て、要求が完了するとすぐにそのメモリを解放しません。データはガベージコレクションに送られますが、IISに割り当てられた予約済みメモリは必要になりません。問題は、1つのリクエストがかなりのメモリをかなり必要とすることを示しているということです。

サーバーコールバックの場合は、表示することを意味するデータに固有のビューモデルを定義し、エンティティからそのデータを選択して、ビューモデルのリストを返します。同じことがWeb APIメソッドにも適用され、必要なデータだけを返すようにDTOを定義します。

var answers = ctx.Answers 
    .Select(a => new AnswerViewModel 
    { 
    AnswerId = a.AnswerId, 
    AnswerText = a.AnswerText, 
    AnswerTypeName = a.AnswerType.Name, // For example, getting values from child references... 
    }).ToList(); 

戻るエンティティは、ビューのパフォーマンスとメモリ使用ポイントの両方から非常に非効率になり、プラスあなたはDbContextの範囲外の参照を使用しようとすると、あなたは簡単に遅延ロードの問題に実行することができます。

また、.Where()句を使用してデータをフィルタリングして、行が多すぎないようにして、データサイズが大幅に拡大する可能性のある道路を検討してください行の制限やページングをサポートして、サーバーが停止する状況を回避することを検討したいと思うかもしれません。なぜなら、任意の数のユーザーがすべてを要求できる2M Answerレコードが終了するからです。

それ以外の場合は、リクエストごとに複数のコンテキストが作成されていることを確認してください。これにはパフォーマンスコストが含まれています。 AutofacのようなIoCコンテナを読むことをお勧めします。これは、MVCに統合することができ、要求ごとに1つのインスタンスしか作成されないように、DbContextまたはWorkラッパーの単位を管理できます。